Acceso a variables de contrato desde pruebas unitarias de JS

Tengo problemas para probar mis contratos por unidad: estoy usando Mocha, Chai y llamotruffle test

estoy probandoLoanRecord.sol

contract LoanRecord {
  public bool on;
  ...

  constructor(...){
    ...
    on = false;
   }

  function external turnOn(){
    on = true;
  }
}

Y probando en record.test.js:

var assert = require('chai').assert
var LoanRecord = artifacts.require("../../contracts/record/LoanRecord.sol");

contract ('Record', function (accounts) {
    describe("#turnOn()", function () {
        it("should turn on a loan record instance", async function () {
            loanrecord = await LoanRecord.new(
                1,
                18,
                0x0000000000000000000000000000000000000002,
                0x0000000000000000000000000000000000000001, 
                "LOAN"
                );
            await assert.equal(loanrecord.on, false)
            await loanrecord.turnOn()
            await assert.equal(loanrecord.on, true)
        });
    });

Sin embargo, estoy recibiendo:

1) Contract: Record
       #turnOn()
         should turn on a loan record instance:
     AssertionError: expected [Function] to equal false
      at Context.<anonymous> (test/record.js:15:26)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:188:7)

¿ Por qué loanrecord.onregresa [Function]en lugar de un tipo booleano?

Corregido (con la ayuda de gitter@dwardu también):

contract ('Record', function (accounts) {
    describe("#turnOn()", function () {
        it("should turn on a loan record instance", async function () {
            loanrecord = await LoanRecord.new(
                1,
                18,
                0x0000000000000000000000000000000000000002,
                0x0000000000000000000000000000000000000001, 
                "LOAN"
                );
            var on = await loanrecord.on()
            await assert.equal(on, false)
            await loanrecord.turnOn()
            var on = await loanrecord.on()
            await assert.equal(on, true)
        });
    });
}

Respuestas (1)

El mensaje de error que recibe le brinda una buena pista sobre cómo comparar la función con un valor booleano. Esto significa que un lado de la comparación es una función y el otro es una variable (o valor).

Para cada variable en sus contratos de Solidity, se genera automáticamente una función captadora pública. function on()Esto significa que se genera automáticamente una función con firma para acceder al valor de la variable on. Por lo tanto, al acceder a las variables, también debe acceder a ellas a través de las funciones getter.

Cambie su await assert.equal(loanrecord.on, true)a await assert.equal(loanrecord.on(), true)y debería funcionar. O es posible que deba awaitdevolver on()el valor de la función antes de comparar.

¿Podemos establecer las variables?