Zugriff auf Vertragsvariablen aus JS-Einheitentests

Ich habe Probleme beim Testen meiner Verträge: Ich verwende Mocha, Chai und Callingtruffle test

Ich testeLoanRecord.sol

contract LoanRecord {
  public bool on;
  ...

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

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

Und testen in 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)
        });
    });

Allerdings erhalte ich:

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)

Warum wird eher loanrecord.onzurückgegeben [Function]als ein boolescher Typ?

Behoben (auch mit Hilfe von gitter@dwardu):

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

Antworten (1)

Die Fehlermeldung, die Sie erhalten, gibt Ihnen einen guten Hinweis zum Vergleichen der Funktion mit einem booleschen Wert. Dies bedeutet, dass eine Seite des Vergleichs eine Funktion und eine eine Variable (oder ein Wert) ist.

Für jede Variable in Ihren Solidity-Verträgen wird automatisch eine öffentliche Getter-Funktion generiert. Damit function on()wird automatisch eine Funktion mit Signatur generiert, um auf den Wert der Variablen zuzugreifen on. Daher müssen Sie beim Zugriff auf die Variablen auch über die Getter-Funktionen darauf zugreifen.

Ändern Sie Ihre await assert.equal(loanrecord.on, true)zu await assert.equal(loanrecord.on(), true)und es sollte funktionieren. Oder Sie müssen möglicherweise awaitden on()Wert der Funktion vor dem Vergleichen zurückgeben.

Können wir die Variablen setzen?