2017-04-06 1 views
1

Ich habe eine Funktion, die die aktuelle Zeit (now) verwendet. Der Vertrag als Ganzes ist ein Crowdfunding-Token und die Kosten für Token unterscheiden sich je nach Datum und Uhrzeit des Kaufs von Token.Unit testing Datetime Werte

Wie simuliert man unterschiedliche Zeiten beim Testen eines Smart Contract? In Bezug auf den unten stehenden Code möchte ich beispielsweise Unit-Tests durchführen, um herauszufinden, ob der Code für die Preisfestlegung korrekt ist, aber ich kann den Wert now nicht ändern.

Wäre es eine gute Lösung sein, einfach das now Schlüsselwort für eine weiteren temporären Test Variable, sagen now_sim und dann manuell verändern now_sim während der Simulation zu ersetzen?

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; 
    } 

Antwort

1

Wenn Sie pyethereum zum Testen verwenden - die ich sehr empfehlen, es ist sehr schön - Sie können direkt den Zeitstempel des simulierten Block ändern, dass Ihre Transaktion Bergbau.

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) 

Sehen Sie ein funktionierendes Beispiel hier (vielleicht ein bisschen out-of-date): https://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85