单元测试日期时间值
Unit testing Datetime values
我有一个使用当前时间的函数 (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;
}
如果你使用 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
我有一个使用当前时间的函数 (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;
}
如果你使用 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