簡體   English   中英

松露測試中的時間延遲

[英]Time delay in Truffle Tests

我正在為我的合同編寫測試用例,並且必須延遲斷言檢查,因為它對時間很敏感。 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)

我如何確保測試檢查與時間延遲一起發生?

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() 已完成,否則不會執行所述邏輯語句和測試完成。

實際上,您可以嘗試在@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.Tokenjs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM