Solidity

測試是否呼叫了智能合約函式

  • June 7, 2022

在我的安全帽項目中,我正在使用chai測試我的智能合約。

為了簡單起見,讓我們假設我的契約是:

contract MyContract {

 function a() external {
   b();
 }

 function b() public{
 }

}

我正在測試函式 a 並希望確保函式 b 已被呼叫一次,例如:

//ACT
await myContract.a();
//ASSERT
expect(b).to.have.been.calledOnce

我怎樣才能做到這一點?

我想到了兩個選擇:

  1. 在您的期望行之前呼叫 b() ,這是一個明顯的解決方案。
  2. 向 b 添加一個狀態變數,並在呼叫 b 後更改它。因此,您可以通過檢查狀態變數來檢查是否呼叫了 b()。

如果通過呼叫一次你的意思是你想確保它至少被你的測試呼叫一次,那麼你可以使用覆蓋率來告訴你每個程式碼分支是否已經被你的測試發癢了。

https://www.npmjs.com/package/coverage

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |    95.15 |    79.52 |      100 |    95.09 |                   |
index.js |     90.6 |    75.38 |      100 |    90.52 |... 44,148,152,156 |
lib.js   |      100 |    94.44 |      100 |      100 |               107 |
----------|----------|----------|----------|----------|-------------------|

如果您在 % Branch 中沒有得到 100,您可以查看在覆蓋目錄中創建的 index.html 報告以查看遺漏的內容。

這是一個破解工具,非常容易使用。如果您使用的是安全帽,而不是

npx hardhat test

它是

npx hardhat coverage

它執行您的測試,但增加了覆蓋範圍

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