Hier ist meine Solidität:
contract Oracle {
mapping(uint => uint) oracle_values;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function Oracle() public {
owner = msg.sender;
}
function StoreDocument(uint _key, uint _value) public onlyOwner() {
oracle_values[_key] = _value;
}
function RetrieveData(uint _date) public constant returns (uint data) {
return oracle_values[_date];
}
}
und mein einfacher Javascript-Test.
var Oracle = artifacts.require("Oracle");
var startDate = 1;
var endDate = 2;
var startVal = 1000;
var endVal = 2000;
contract('Oracle',function(){
it("Store Values", function(){
return Oracle.deployed().then(function(instance){
instance.StoreDocument(startDate,startVal);
instance.StoreDocument(endDate,endVal);
}).then(function(instance){
assert.equal(instance.RetrieveData(startDate),startVal,"Start Value incorrect");
assert.equal(instance.RetrieveData(endDate),endDate,"End Date incorrect");
});
});
Ich erhalte immer wieder den Fehler „Eigenschaft von RetriveData kann nicht gelesen werden“ ... was seltsam ist, da StoreDocument gefunden wird.
Wie Sie vielleicht erkennen können, ist dies sozusagen mein erster Trüffeltest, daher wären Tipps oder sogar gute Ressourcen sehr willkommen!
Das Problem liegt im zweiten function(instance)
. Oracle.deployed() gibt die Instanz zurück, die jedoch nur für die erste zurückgegeben wird (und für diese verfügbar ist) then()
. Der Rückgabewert für das zweite then()
ist undefiniert, da es dann nach dem Rückgabewert aus dem Code aus dem ersten sucht.
Sie müssen die Instanz speichern, um sie für beide zugänglich zu machen, zum Beispiel:
contract('Oracle',function(){
let contractInstance;
it("Store Values", function(){
return Oracle.deployed().then(function(instance){
contractInstance = instance; // save here to make it accessible
contractInstance.StoreDocument(startDate,startVal);
contractInstance.StoreDocument(endDate,endVal);
}).then(function(){ // there is no instance available here
// change the asserts to refer to the saved instance:
assert.equal(contractInstance.RetrieveData(startDate),startVal,"Start Value incorrect");
assert.equal(contractInstance.RetrieveData(endDate),endDate,"End Date incorrect");
});
});
das Fett