I am having trouble unit testing my contracts: I am using Mocha, Chai and calling truffle test
I am testing LoanRecord.sol
contract LoanRecord {
public bool on;
...
constructor(...){
...
on = false;
}
function external turnOn(){
on = true;
}
}
And testing 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)
});
});
However, I am recieving:
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)
Why does loanrecord.on
return [Function]
rather than a boolean type?
Fixed (with gitter@dwardu help too):
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)
});
});
}
Best Answer
The error message you're getting is giving you a good hint about comparing function to a boolean value. This means one side of the comparison is a function and one is a variable (or value).
For each variable in your Solidity contracts, a public getter function is automatically generated. This means a function with signature
function on()
is automatically generated to access the value of the variableon
. Therefore when accessing the variables you also have to access them through the getter functions.Change your
await assert.equal(loanrecord.on, true)
toawait assert.equal(loanrecord.on(), true)
and it should work. Or you might need toawait
foron()
function's value to be returned before comparing.