2017-04-06 69 views
1

我有一個利用當前時間的函數(now)。合同作爲一個整體是一個衆籌令牌,代幣的花費取決於代幣購買的日期和時間。單元測試日期時間值

測試智能合同時,一個人如何模擬不同的時間?例如,關於下面的代碼,我想進行單元測試,以確定設置價格的代碼是否正確,但我無法更改now的值。

難道是一個很好的解決方案簡單地替代now關鍵字的另一個臨時測試變量,說now_sim然後模擬過程中手動更改now_sim

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

回答

1

如果使用pyethereum測試 - 我強烈建議,它的可愛 - 你可以直接改變是挖掘您的交易模擬塊的時間戳。

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) 

看到這裏的工作示例(也許有點亂日期):https://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85