Solidity
Truffle — 測試列舉值
我正在使用truffle開發一個簡單的智能合約。
我有以下契約:
contract Puppy { enum State { good, bad } State public status; State public constant INITIAL_STATUS = State.good; function Puppy() { status = INITIAL_STATUS; } }
我希望對其進行如下測試:
const Puppy = artifacts.require('./Puppy.sol') contract('Puppy', () => { it('sets the initial status to \'good\'', () => Puppy.deployed() .then(instance => instance.status()) .then((status) => { assert.equal(status, Puppy.State.good, 'Expected the status to be \'good\'') })) })
這拋出
TypeError: Cannot read property 'good' of undefined
如果我將測試更改為
const Puppy = artifacts.require('./Puppy.sol') contract('Puppy', () => { it('sets the initial status to \'good\'', () => Puppy.deployed() .then(instance => instance.status()) .then((status) => { assert.equal(status, 0, 'Expected the status to be \'good\'') })) })
它通過了。
我如何
enum
從測試中引用?
讓我們以測試契約為例:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.3; contract Test { enum Stages { stage_01, stage_02, stage_03, stage_04, stage_05 } Stages public stage = Stages.stage_01; function setStage(Stages _stage) public { stage = _stage; } }
並以這種方式進行測試:
const TestContract = artifacts.require('Test'); contract('Test', function (accounts) { const owner = accounts[0]; const txParams = { from: owner }; beforeEach(async function () { this.testContract = await TestContract.new(txParams); }); it('test initial stage', async function () { expect((await this.testContract.stage()).toString()).to.equal(TestContract.Stages.stage_01.toString()); }); it('assign custom stage', async function () { await this.testContract.setStage(TestContract.Stages.stage_05); expect((await this.testContract.stage()).toString()).to.equal(TestContract.Stages.stage_05.toString()); }); it('assign custom number to stage', async function () { await this.testContract.setStage(3); // take into account that enum indexed from zero expect((await this.testContract.stage()).toString()).to.equal(TestContract.Stages.stage_04.toString()); }); });