Solidity

沒有事件發生。為什麼?

  • January 16, 2022

這不是一個重複的問題。另一個沒有以任何方式回答這個問題。誰能向我解釋為什麼我No Events where emmited在執行松露測試時會得到?Ganache 正在偵聽 7545,而我的 truffle 配置文件指向該埠。每次執行 truffle 測試時,我都可以看到在 Ganache 中生成了更多塊。

我開始認為這與合約程式碼或鬆露測試無關,但它們是:

合約程式碼

function addExam(string memory hash) public returns (string memory examProfessorHash) {
   // save the exam hash and link it with the professors address
   professorsExam[msg.sender] = hash;

   return professorsExam[msg.sender];
}

測試程式碼

it("should add an exam to the exams list", async () => {
   let hash_test = "9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08";
   let instance = await Exam.deployed();
   let hash = await instance.addExam(hash_test, {from: accounts[0]});
   assert.equal(hash.valueOf(), hash_test, "Not returning the correct address");

為什麼我會得到

契約:考試 ✓ 應通過此測試

未發出任何事件

  1. 應將考試添加到考試列表中

未發出任何事件

您的addExam函式不是vieworpure函式,它會修改合約的狀態。因此它返回一個交易雜湊而不是真正的函式返回值,因為交易需要被探勘才能給你結果。

您的測試失敗,因為assert當返回值只是交易雜湊時,返回值是所需的地址。當鬆露測試失敗時,它會向您顯示執行期間發出的事件 - 在您的情況下,您沒有發出任何事件,因此它只是說沒有發出任何事件。您可以在此處閱讀更多詳細資訊:如何修復“未發出事件”

根據我對您的問題的評論(請通讀),您可以通過以下方式修復程式碼:

在契約中:

event ExamAdded(string hash);

function addExam(string memory hash) public returns (string memory examProfessorHash) {
   // save the exam hash and link it with the professors address
   professorsExam[msg.sender] = hash;
   emit ExamAdded(professorsExam[msg.sender]);
   return professorsExam[msg.sender];
}

在測試中:

it("should add an exam to the exams list", async () => {
   const hash_test = "9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08";
   const instance = await Exam.deployed();
   const response = await instance.addExam(hash_test, {from: accounts[0]});
   assert.equal(response.logs[0].args.hash, hash_test, "Not returning the correct address");
});

注意:

  • emit ExamAdded(professorsExam[msg.sender]);僅當從鏈下(即從 web3 腳本)呼叫函式時才有用
  • return professorsExam[msg.sender];僅當從鏈上呼叫函式時(即從該合約或從另一個合約)呼叫該函式時才有用

因此,您通常應該僅在確實需要時添加這些語句中的每一個。

旁注:出於您的目的,您似乎可以使用bytes32而不是string,這將使您的程式碼更高效(更少消耗氣體)。

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