Trüffeltest liest Vertrag nicht

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!

Antworten (1)

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");
    });
   });
Danke für die Hilfe! es scheint, dass RetrieveData jetzt nur ein leeres Promise ({}) zurückgibt. Ich habe auch die Assert- und Datenabrufschritte getrennt, und das hilft nicht