[Reboot 이타인클럽] #6 ERC777 토큰 Truffle Test

in Korea • 한국 • KR • KO4 years ago

이전글 - [Reboot 이타인클럽] #5 홈페이지 세련되게2 Feat. 스팀잇 커뮤니티 연동

image.png

이타인클럽 리부트 중입니다. 많은 관심과 응원, 참여 부탁드립니다.

  • 홈페이지 개편
  • 스마트 컨트랙트 토큰 적용
  • 도움 요청 분야 세분화
  • 영상 통화를 이용한 도움 받기

ERC777 Token Test

간단히 만든 ERC777 기반의 EtainClubToken을 테스트해보겠습니다.
ERC777이 사용이 많이 안된건지.. 기존에 자료들을 찾아서 테스트하는데 계속 에러가 납니다.

기본적으로 Truffle의 Test 기능을 사용하는데, Truffle 홈페이지의 설명대로 하면 에러가 납니다.
https://www.trufflesuite.com/docs/truffle/testing/writing-tests-in-javascript

저는 Mocha라는 테스트 프레임워크를 이용한데. 이것 말고도 Chai라는 것이 있나봅니다. 자료들이 섞여 있어서 주의가 필요합니다.

토큰 이름, 심볼 테스트

기본적으로 Truffle Test를 이용해서 토큰 이름, 심볼을 테스트하는 코드는 다음과 같습니다.
프로젝트 폴더에 test라는 폴더가 있고, 테스트하고자 하는 목적에 맞게 테스트파일 이름을 정해서 다음과 같은 내용을 입력합니다. 여기서는 test/erc.js 로 합니다.

const EtainToken = artifacts.require("EtainClubToken");

contract("Token Test", async (accounts) => {
  it("token name", async () => {
    let instance = await EtainToken.deployed();
    const tokenName = await instance.name();
    assert.equal(tokenName, "EtainClubToken");
  });

  it("token symbol", async () => {
    let instance = await EtainToken.deployed();
    const symbol = await instance.symbol();
    assert.equal(symbol, "ECT");
  });
});

미리 만들어 둔 EtainClubToken 컨트랙트를 불러오고, unit test 부분에서 블록체인 네트워크에 배포된 컨트랙트의 instance를 가져와서 이것으로부터 테스트를 진행합니다.

1

테스트를 실행하기 앞서서 ganache 네트워크를 실행합니다.

$ ganache-cli -p 7545 -i 5777

실행에 필요한 인자는 이전글들을 참고하세요. truffle.config.js에 설정된 대로 입력해야 합니다.

2

테스트 실행은 매우 간단합니다. 다음과 같이 합니다.

$ truffle test --network ganache

Using network 'ganache'.


Compiling your contracts...
===========================
✔ Fetching solc version list from solc-bin. Attempt #1
> Compiling ./contracts/EtainToken.sol
✔ Fetching solc version list from solc-bin. Attempt #1
> Artifacts written to /tmp/test-202065-8859-1duucck.ih09
> Compiled successfully using:
   - solc: 0.6.10+commit.00c0fcaf.Emscripten.clang

  Contract: Token Test
    ✓ token name (40ms)
    ✓ token symbol

에러가 없이 테스트가 잘 완료됩니다.

getBalance 에러

Truffle 홈페이지에 있는대로 하면 에러가 발생합니다.
어쨌든 Truffle로 ERC777 토큰을 테스트하려고 하면 다음과 같은 부분에서 에러가 발생합니다.

let balance = await instance.getBalance.call(accounts[0]);

ERC777 토큰을 살펴보면 getBalance라는 속성이 없습니다. 그래서 에러가 납니다.

ERC777에서는 다음과 같이 해야 합니다.

 const creatorBalance = await instance.balanceOf(accounts[0]);

Big Number 비교

Big Number(BN)비교 할 때도 주의가 필요합니다. 그냥 비교하면 에러가 발생합니다.
참고. https://ethereum.stackexchange.com/questions/67087/how-to-use-bignumbers-in-truffle-tests

Contract: Token Test
       creator balance:

      AssertionError: expected <BN: 3e8> to equal <BN: 3e8>
      + expected - actual

그래서 다음과 같이 합니다.

    assert.equal(creatorBalance.toString(), totalSupply.toString());

테스트 코드 전문

몇 가지 테스트 코드의 전문입니다.

const EtainToken = artifacts.require("EtainClubToken");

contract("Token Test", async (accounts) => {
  it("token name", async () => {
    let instance = await EtainToken.deployed();
    const tokenName = await instance.name();
    assert.equal(tokenName, "EtainClubToken");
  });

  it("token symbol", async () => {
    let instance = await EtainToken.deployed();
    const symbol = await instance.symbol();
    assert.equal(symbol, "ECT");
  });

  it("total supply", async () => {
    let instance = await EtainToken.deployed();
    const totalSupply = await instance.totalSupply();
    assert.equal(totalSupply, 1000);
  });

  it("creator balance", async () => {
    let instance = await EtainToken.deployed();
    const creatorBalance = await instance.balanceOf(accounts[0]);
    const totalSupply = await instance.totalSupply();
    console.log("creator balance", creatorBalance);
    assert.equal(creatorBalance.toString(), totalSupply.toString());
  });
});


이제 테스트도 되니깐 이타인토큰 컨트랙트를 구현해가면서 테스트해보겠습니다.


도움 주고 받기 앱 helpus

Coin Marketplace

STEEM 0.20
TRX 0.15
JST 0.030
BTC 65317.17
ETH 2646.03
USDT 1.00
SBD 2.86