Очень простой тест Truffle, но утверждение не выполняется (похоже, функции в Remix работают нормально)

В моем файле QueryResultHandler.sol у меня есть три функции: одна для хранения данных (запрос двух идентификаторов в виде целых чисел и двух строковых значений) и две для проверки (путем предоставления целых чисел или строковых значений). 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 и хотел написать очень простой модульный тест, который сохраняет некоторые данные, а затем проверяет их. Функция хранилища возвращает 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);
       });   
    });
});

Ответы (1)

Проблема в том, что когда вы используете 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функцию, поэтому ее не нужно менять.

Большое спасибо, теперь это действительно работает, и я узнал кое-что новое :) и я не смог бы понять это сам за миллион лет.