单元测试日期时间值

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