체인의정석

ethers+hardhat) 스마트컨트렉트에서 uint256 배열이 리턴되는 경우의 테스트 코드 본문

블록체인/Ethers & web3

ethers+hardhat) 스마트컨트렉트에서 uint256 배열이 리턴되는 경우의 테스트 코드

체인의정석 2022. 5. 25. 17:27
728x90
반응형

새로 작성된 멀티시그의 테스트 코드 커버리지를 100% 까지 올리기 위해서 추가적인 테스트 코드를 작성하였다.

 

지난번과 다르게 이번엔 숫자형의 배열을 리턴해와서 값을 비교하는 것이 생겼는데

이런 배열의 경우 deep.equal을 사용했던 기억이 있어 비교해 보았다.

      it("Should return right Function status after submitTransaction is submitted", async () => {
        expect(await ContractName.fuctionName(input)).to.deep.equal([1]);
      }) 
      
//스마트컨트렉트의 결과 값 : returns (uint256[] memory)

 

그러나 배열안의 숫자가 Bignumber 형태로 리턴되어서 오류가 났다.

      AssertionError: expected [ BigNumber { value: "1" } ] to deeply equal [ 1 ]
      + expected - actual

처음에는 비교하는 값 자체에서 값을 뽑아내려고 

로그를 찍어가며 값을 짚어내려 했지만 undefined 만 나오는걸 확인할 수 있었다.

https://github.com/OpenZeppelin/chai-bn/pull/7

 

Deep equality checks for arrays, objects, etc. containing big numbers by pf92 · Pull Request #7 · OpenZeppelin/chai-bn

This pull request enables deep equality checks for arrays, objects, etc. that contain big numbers. E.g., now the following check works: const array1 = [new BN(1), '2', new BN(-10)]; const array2 = ...

github.com

 키워드를 잡고 검색한 결과 한 해결방안을 발견했다.

 

결국 bigNumber 형태로 비교하는 값을 지정해주면 오류가 해결된다는 말 같다.

https://docs.ethers.io/v5/api/utils/bignumber/#BigNumber

 

BigNumber

Documentation for ethers, a complete, tiny and simple Ethereum library.

docs.ethers.io

ethers 문서를 찾아보니 문법이 보여서 테스트코드를 다음과 같이 수정햇더니 통과하였다.

      it("Should return right Function status after submitTransaction is submitted", async () => {
        expect(await ContractName.fuctionName(input)).to.deep.equal([(ethers.BigNumber.from(1))]);
      })

교훈

이런걸 보니 결과 값에서 오류가 날 경우 이걸 ethers 모듈에서 찾아서 결과값 또한 맞는 자료 형태로 바꾸어 준 후 비교하면 되겠구나 싶은 생각이 들었다.

 

"스마트컨트렉트 테스트시 나오는 결과값이 데이터 타입때문에 오류가 나는 경우 ethers모듈을 사용해서 같은 형태로 비교해보기"

 

PS) 구조체에 대한 비교의 경우도 마찬가지로 구조체를 가져와서 거기서 비교할 값을 하나하나 지정해서 각각 비교를 하면 테스트 코드로 다 결과값에 대한 비교가 가능할거 같다.

728x90
반응형
Comments