Sehr einfacher Truffle-Test, aber Assertion schlägt fehl (Funktionen scheinen in Remix gut zu funktionieren)

In meiner Datei QueryResultHandler.sol habe ich drei Funktionen: eine zum Speichern von Daten (Anforderung von zwei IDs als Ganzzahlen und zwei Zeichenfolgenwerte) und zwei zur Validierung (entweder durch Bereitstellen der Ganzzahlen oder der Zeichenfolgenwerte). Die 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;
   }
}

Ich verwende Truffle und wollte einen sehr einfachen Komponententest schreiben, der einige Daten speichert und dann validiert. Die Store-Funktion gibt true zurück, die Validierung schlägt jedoch danach fehl. Kann mir bitte jemand helfen, woran kann das liegen?

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

Antworten (1)

Das Problem ist, dass wenn Sie query.storeQueryResults.call(1,21,"a","b")die Funktion aufrufen. Sie ändern den Vertragsstatus nicht wirklich; So rufen Sie Lesefunktionen (pure/constant/view) auf

Was Sie tun möchten, ist, Ihren Trüffeltest von zu ändern

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

Zu

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

Beachten Sie, dass jetzt kein Teil vorhanden ist .call().

Der zweite Teil Ihres Tests ruft eine viewFunktion auf, damit sich nichts ändern muss.

Vielen Dank, es funktioniert jetzt wirklich und ich habe etwas Neues gelernt :) und ich hätte es in einer Million Jahren nicht selbst herausfinden können.