Solidity
沒有事件發生。為什麼?
這不是一個重複的問題。另一個沒有以任何方式回答這個問題。誰能向我解釋為什麼我
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");
為什麼我會得到
契約:考試 ✓ 應通過此測試
未發出任何事件
- 應將考試添加到考試列表中
未發出任何事件
您的
addExam
函式不是view
orpure
函式,它會修改合約的狀態。因此它返回一個交易雜湊而不是真正的函式返回值,因為交易需要被探勘才能給你結果。您的測試失敗,因為
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
,這將使您的程式碼更高效(更少消耗氣體)。