松露测试中的时间延迟

Sus*_*mar 4 javascript ethereum truffle

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

\n\n
it("Time sensitive check", async () => {\n\n    var deadLine = Math.round(Date.now() / 1000) + 3;\n    let eventDetails = await contract.createCampaign("Campaign name",deadLine,\n    {\n        from: accounts[0]\n    });\n\n    addressFromEvent = eventDetails[\'logs\'][1][\'args\'][\'campaignAddress\'];\n\n    async function checker() {\n        let deployedCampaigns = await factory.getCompletedCampaigns();\n        assert.equal(addressFromEvent, deployedCampaigns[0]);\n    }\n\n    function timeout(ms) {\n        return new Promise(resolve => setTimeout(resolve, ms));\n    }\n\n    async function sleep() {\n        await timeout(5000);\n        return checker();\n    }\n\n    sleep();\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Contract: Testing CrowdCoin\n    \xe2\x9c\x93 CampaignFactory deployment\n    \xe2\x9c\x93 Create a new Campaign (168ms)\n    \xe2\x9c\x93 Get ongoing Campaigns (246ms)\n    \xe2\x9c\x93 Get completed Campaigns (189ms)\n\n\n  4 passing (1s)\n\ntruffle(develop)> \n/home/vagrant/code/test/crowdcoin.test.js:82\n            assert.equal(0, deployedCampaigns[1]);\n          ^\nAssertionError: expected 0 to equal \'0x806ea81c279b6000b9fd9f14d2845dec87fc3544\'\n    at checker (/home/vagrant/code/test/crowdcoin.test.js:82:11)\n    at process._tickCallback (internal/process/next_tick.js:68:7)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何确保测试检查伴随时间延迟进行?

\n

Sus*_*mar 5

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]);
});
Run Code Online (Sandbox Code Playgroud)

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