Solidity

Hardhat 和 Chai 測試:我應該如何編寫測試?

  • November 27, 2022

我已經研究了所有相關問題,但這些都不適合我。我使用了這個 repo,並替換了契約和測試文件:https ://github.com/NomicFoundation/hardhat-boilerplate

編輯 26/11:如果您想自己嘗試,可以通過上面的回購協議進行簡單修改來重現它: https ://github.com/NomicFoundation/hardhat-boilerplate/issues/79

我會先給出問題的背景,然後再介紹我的問題。

上下文描述

該契約是一個多重簽名錢包,在建構時定義了批准者。我在這裡獲得簽名者,然後在我將 signer0..2 設置為批准者的地方部署我的契約:

const [signer0, signer1, signer2, signer3, signer4] = await ethers.getSigners();
const wallet = await walletFactory.deploy([signer0.address, signer1.address, signer2.address]);

我正在測試這個堅固的功能:

   function createTransfer (uint amount, address payable to) external onlyApprover() {
   transfers.push(Transfer(
       transfers.length,
       amount,
       to,
       0,
       false)
   );
}

它有一個修飾符 onlyApprover :

   modifier onlyApprover() {
   bool allowed = false;
   for (uint i=0; i<approvers.length; i++) {
       if (approvers[i] == msg.sender) {
           allowed = true;
       }
   }
   require(allowed == true, "only approver allowed");
   _;
}

當使用不屬於 approvers 數組的帳戶呼叫此函式時,它會恢復。

問題

await expect(wallet.connect(signer3).createTransfer(100, addr4, {from: signer3.address}));

或者

await expect(wallet.connect(signer3).createTransfer(100, addr4, {from: signer3.address})
   ).to.be.reverted;

測試通過,而它應該只通過第二個

如果我將 await 放在 expect 中:

expect(await wallet.connect(signer3).createTransfer(100, addr4, {from: signer3.address}));

或者

expect(await wallet.connect(signer3).createTransfer(100, addr4, {from: signer3.address})
   ).to.be.reverted;

在這兩種情況下測試都沒有通過這個錯誤,這是我期望的可靠性錯誤 !.. 但它應該被測試擷取並在 to.be.reverted 情況下驗證它。

錯誤:處理事務時出現 VM 異常:已恢復,原因字元串為“僅允許批准者”

我還嘗試使用 to.be.revertedWith(‘only approver allowed’),兩種情況下都存在同樣的問題。

問題

我錯過了什麼?是否有人有一個回購協議可以分享我在哪裡可以看到類似的實施和工作?

謝謝

我從這個回購協議的成員那裡得到了一個解釋一切的答案:

如果你確實 await expect(…something…),那麼在 expect 中返回的 promise 將被 Chai 擷取。如果您隨後不對該承諾斷言任何內容,則結果將被丟棄並且測試將通過

我不知道這一點,現在我找到瞭如何驗證交易未還原(我正在尋找的),我需要使用.not.to.be.revertedhttps ://www.chaijs.com/api/bdd/#method_not

引用自:https://ethereum.stackexchange.com/questions/140035