Solidity
非常簡單的 Truffle 測試,但斷言失敗(功能似乎在 Remix 中執行良好)
在我的 QueryResultHandler.sol 文件中,我有三個函式:一個用於儲存數據(請求兩個 ID 作為整數和兩個字元串值)和兩個用於驗證(通過提供整數或字元串值)。QueryResultHandler.js:
pragma solidity ^0.4.4; contract QueryResultHandler { struct QueryResultStruct { bytes32 finalHash; bytes32 queryHash; bytes32 resultHash; uint256 queryId; uint256 resultId; } QueryResultStruct[] queryResultStructArray; function storeQueryResults(uint256 _queryId, uint256 _resultId, string _queryString, string _resultString) external returns (bool success) { bytes32 queryHash = keccak256(_queryString); bytes32 resultHash = keccak256(_resultString); bytes32 hashThem = keccak256(queryHash, resultHash); queryResultStructArray.push(QueryResultStruct(hashThem, queryHash, resultHash, _queryId, _resultId)); return true; } function validateQueryResultsById(uint256 _queryId, uint256 _resultId) external view returns (bool success) { for (uint i = 0; i < queryResultStructArray.length; i++){ if (queryResultStructArray[i].queryId == _queryId && queryResultStructArray[i].resultId == _resultId) { return true; } } return false; } function validateQueryResultsByString(string _queryString, string _resultString) external view returns (bool success) { bytes32 queryHash = keccak256(_queryString); bytes32 resultHash = keccak256(_resultString); bytes32 hashThem = keccak256(queryHash, resultHash); for (uint i = 0; i < queryResultStructArray.length; i++) { if (queryResultStructArray[i].finalHash == hashThem) { return true; } } return false; } }
我正在使用 Truffle,我想編寫一個非常簡單的單元測試,它儲存一些數據然後對其進行驗證。store 函式返回 true,但是之後驗證失敗。有人可以幫我嗎,可能是什麼問題?
'use strict'; var QueryResultHandler = artifacts.require("./QueryResultHandler.sol"); contract('QueryResultHandler', function() { it("should store 1, 21, a, b and then verify by the ID/string", async () => { let query = await QueryResultHandler.deployed(); query.storeQueryResults.call(1,21,"a","b").then(function(stored){ console.log(stored); }); query.validateQueryResultsByString.call("a","b").then(function(valid){ console.log(valid); }); }); });
問題是當您使用
query.storeQueryResults.call(1,21,"a","b")
呼叫該函式時。您並沒有真正改變契約狀態;這就是您呼叫讀取(純/常量/視圖)函式的方式你想要做的是改變你的松露測試
query.storeQueryResults.call(1,21,"a","b").then(function(stored){ console.log(stored); });
到
query.storeQueryResults(1,21,"a","b").then(function(stored){ console.log(stored); });
請注意,現在沒有
.call()
部分。測試的第二部分是呼叫一個
view
函式,因此不需要更改。