Prueba de trufa que no lee el contrato

Aquí está mi solidez:

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];
  }
}

y mi simple prueba de Javascript.

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

Sigo recibiendo el error 'no se puede leer la propiedad de RetriveData'... lo cual es extraño ya que se encontró StoreDocument.

Como puede ver, es mi primera prueba de trufas, por lo que agradecería mucho cualquier consejo o incluso buenos recursos.

Respuestas (1)

El problema está en el segundo function(instance). Oracle.deployed() devuelve la instancia, pero solo se devuelve (y está disponible para) el primero then(). El valor de retorno para el segundo then()no está definido, ya que está buscando el valor de retorno del código dentro del primero.

Debe guardar la instancia para que sea accesible para ambos, por ejemplo:

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");
    });
   });
¡Gracias por la ayuda! parece que RetrieveData ahora solo devuelve una Promesa vacía ({}). Separé los pasos de afirmación y recuperación de datos también y eso no ayuda