Solidity

Truffle — 測試列舉值

  • September 15, 2021

我正在使用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());
   });      
});

引用自:https://ethereum.stackexchange.com/questions/29344