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);
});
});
});
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 view
Funktion auf, damit sich nichts ändern muss.
Anton