2017-04-06 1 views
1

J'ai une fonction qui utilise l'heure actuelle (now). Le contrat dans son ensemble est un jeton de financement participatif et le coût des jetons diffère selon la date et l'heure d'achat des jetons. Comment simuler des moments différents lors du test d'un contrat intelligent?Tests unitaires Valeurs datetime

Par exemple, en ce qui concerne le code ci-dessous, je voudrais faire des tests unitaires pour savoir si le code pour fixer le prix est correct mais je ne peux pas changer la valeur de now. Serait-ce une bonne solution de remplacer simplement le mot-clé now par une autre variable de test temporaire, par exemple now_sim, puis de modifier manuellement now_sim pendant la simulation?

if (now < (startTime + 1 days)) { 
     currentPrice = safeDiv(safeMul(price, 80), 100); // 20 % discount (x * 80/100) 
    } 
    else if (now < (startTime + 2 days)) { 
     currentPrice = safeDiv(safeMul(price, 90), 100); // 10 % discount (x * 90/100) 
    } 
    else if (now < (startTime + 12 days)) { 
     // 1 % reduction in the discounted rate from day 2 until day 12 (sliding scale per second) 
     // 8640000 is 60 x 60 x 24 x 100 (100 for 1%) (60 x 60 x 24 for seconds per day) 
     currentPrice = price - safeDiv(safeMul((startTime + 12 days) - now), price), 8640000); 
    } 
    else { 
     currentPrice = price; 
    } 

Répondre

1

Si vous utilisez pyethereum pour les tests - que je recommande fortement, il est beau - vous pouvez modifier directement l'horodatage du bloc simulé qui est l'exploitation minière votre transaction.

self.s = t.state() 
self.s.block.timestamp = self.s.block.timestamp + 86400 
self.s.mine(1) 
some_val = your_contract.do_something(some_parameter) 
self.assertEqual(some_val, whatever) 

Voir un exemple de travail ici (peut-être un peu out-of-date): https://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85