【问题标题】:Time delay in Truffle Tests松露测试中的时间延迟
【发布时间】:2018-08-21 08:44:19
【问题描述】:

我正在为我的合同编写测试用例,并且必须延迟断言检查,因为它对时间敏感。 getCompletedCampaigns() 将包含截止日期已过的活动的地址。

it("Time sensitive check", async () => {

    var deadLine = Math.round(Date.now() / 1000) + 3;
    let eventDetails = await contract.createCampaign("Campaign name",deadLine,
    {
        from: accounts[0]
    });

    addressFromEvent = eventDetails['logs'][1]['args']['campaignAddress'];

    async function checker() {
        let deployedCampaigns = await factory.getCompletedCampaigns();
        assert.equal(addressFromEvent, deployedCampaigns[0]);
    }

    function timeout(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    async function sleep() {
        await timeout(5000);
        return checker();
    }

    sleep();
});

即使断言应该失败,测试也会通过。断言发生在测试套件完成执行所有测试并强制提示来自truffle develop 控制台,因为如果它失败了。在下面的测试中,我故意没有通过测试。

Contract: Testing CrowdCoin
    ✓ CampaignFactory deployment
    ✓ Create a new Campaign (168ms)
    ✓ Get ongoing Campaigns (246ms)
    ✓ Get completed Campaigns (189ms)


  4 passing (1s)

truffle(develop)> 
/home/vagrant/code/test/crowdcoin.test.js:82
            assert.equal(0, deployedCampaigns[1]);
          ^
AssertionError: expected 0 to equal '0x806ea81c279b6000b9fd9f14d2845dec87fc3544'
    at checker (/home/vagrant/code/test/crowdcoin.test.js:82:11)
    at process._tickCallback (internal/process/next_tick.js:68:7)

我如何确保测试检查随着时间延迟发生?

【问题讨论】:

    标签: javascript ethereum truffle


    【解决方案1】:
    it("Time sensitive check", async () => {
    
        var deadLine = Math.round(Date.now() / 1000) + 3;
        let eventDetails = await contract.createCampaign("Campaign name",deadLine,
        {
            from: accounts[0]
        });
    
        function timeout(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }
    
        await timeout(5000);
    
        addressFromEvent = eventDetails['logs'][1]['args']['campaignAddress'];
        let deployedCampaigns = await factory.getCompletedCampaigns();
        await assert.equal(addressFromEvent, deployedCampaigns[0]);
    });
    

    通过将整个延迟逻辑移动到不同的方法和所有以 await 开头的逻辑语句,除非 timeout() 完成,否则所述逻辑语句的执行和测试完成不会完成。

    【讨论】:

      【解决方案2】:

      实际上您可以尝试在@openzeppelin/test-helper 中使用time 来加速您的测试用例,因为您无需等待在此测试用例上运行3 秒。

      const { time } = require("@openzeppelin/test-helpers");
      
      it("Time sensitive check", async () => {
          let duration = time.duration.seconds(3);
          let eventDetails = await contract.createCampaign("Campaign name",duration,
          {
              from: accounts[0]
          });
      
          await time.increase(duration);
      
          addressFromEvent = eventDetails['logs'][1]['args']['campaignAddress'];
          let deployedCampaigns = await factory.getCompletedCampaigns();
          await assert.equal(addressFromEvent, deployedCampaigns[0]);
      });
      

      这对在区块链中测试时间戳更有意义。

      文档:https://docs.openzeppelin.com/test-helpers/0.5/api#time

      @openzeppelin 团队如何处理测试用例的示例,您可以查看: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/24a0bc23cfe3fbc76f8f2510b78af1e948ae6651/test/token/ERC20/utils/TokenTimelock.test.js

      【讨论】:

        猜你喜欢
        • 2012-04-18
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        相关资源
        最近更新 更多