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);
});
});
});
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 view
función para que no tenga que cambiar.
antonia