Prueba de trufa muy simple, pero la afirmación falla (las funciones parecen funcionar bien en Remix)

En mi archivo QueryResultHandler.sol, tengo tres funciones: una para almacenar datos (solicitando dos ID como números enteros y dos valores de cadena) y dos para validación (ya sea proporcionando los números enteros o los valores de cadena). 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;
   }
}

Estoy usando Truffle y quería escribir una prueba unitaria muy simple, que almacena algunos datos y luego los valida. La función de almacenamiento devuelve verdadero, sin embargo, la validación falla después. ¿Puede alguien ayudarme, cuál puede ser el problema?

'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);
       });   
    });
});

Respuestas (1)

El problema es que cuando estás usando query.storeQueryResults.call(1,21,"a","b")para llamar a la función. Realmente no estás cambiando el estado del contrato; así es como se llama a las funciones de lectura (pura/constante/vista)

Lo que quieres hacer es cambiar tu prueba de trufa de

query.storeQueryResults.call(1,21,"a","b").then(function(stored){
    console.log(stored);
});

A

query.storeQueryResults(1,21,"a","b").then(function(stored){
    console.log(stored);
});

Note que no hay .call()parte ahora.

La segunda parte de su prueba es llamar a una viewfunción para que no tenga que cambiar.

Muchas gracias, realmente funciona ahora y he aprendido algo nuevo :) y no podría haberlo descubierto por mí mismo en un millón de años.