Solidity

非常簡單的 Truffle 測試,但斷言失敗(功能似乎在 Remix 中執行良好)

  • March 28, 2018

在我的 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函式,因此不需要更改。

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