Solidity 개발자: Smock v2를 만나보세요 . Solidity 모킹 라이브러리 . _ Optimism 과 DeFi Wonderland 의 환상적인 팀 간의 협력 .
스마트 계약 테스트는 역사적으로… 어려웠습니까? 어렵지 않다면 혼란스러울 뿐입니다. Solidity 초기에 계약을 테스트하는 가장 좋은 방법은 모든 테스트를 수행할 책임이 있는 다른 계약을 작성하는 것이 었습니다. 이것은 약 20가지의 다른 이유로 끔찍한 생각이었습니다. 가장 중요한 몇 가지를 언급하겠습니다.
-
Solidity에서 테스트 코드를 작성해야 했습니다.
-
테스트를 변경하기 위해 테스트 계약을 다시 컴파일해야 했습니다.
-
테스트 계약과 대상 계약은 동일한 체인 상태를 공유했습니다.
관련된 모든 사람들에게 엄청난 시간 낭비였습니다. 그 당시에는 스마트 계약이 비교적 단순했기 때문에 대부분 괜찮 았습니다 . 그러나 물론 이러한 테스트 인프라 부족은 계약이 매우 복잡할 수 없음을 의미했습니다.
시간이 좀 걸렸지만 마침내 Truffle과 같은 JavaScript 테스트 프레임워크를 사용하여 테스트 환경을 크게 개선했습니다. 우리는 chai 및 mocha와 같은 도구의 멋진 기능 중 일부를 물려받았습니다. 우리의 테스트는 적어도 어느 정도는 읽을 수 있게 되었습니다. 실제로 합리적인 양의 복잡성으로 계약 시스템을 구축할 수 있습니다.
Hardhat은 결국 Truffle이 먼저 수행한 많은 작업을 개선했습니다. 그러나 Hardhat의 주요 발전은 플러그인 시스템이었습니다. 이제 개발자는 Truffle로는 불가능했던 테스트 환경을 쉽게 조작할 수 있게 되었습니다.
그러나이 모든 개선 과정에서 Solidity 개발자는 여전히 매우 구체적인 기능을 단위 테스트 할 수 있도록 Solidity로 작성된 모의 계약 이라는 절대적으로 끔찍한 패턴을 처리해야했습니다 . 내 말은, 정말??? 이것이 그렇게 나쁜 몇 가지 이유는 다음과 같습니다.
-
Solidity에서 테스트 코드를 작성해야 합니다.
-
테스트를 변경하려면 테스트 계약을 다시 컴파일해야 합니다.
-
테스트 계약과 대상 계약은 동일한 체인 상태를 공유합니다.
???
응. 그래도. 우리는 그것을 고쳤습니다.
소개: 작업복 v2. JavaScript에서 조롱하는 계약. 당신이 상상할 수 있는 것보다 더 강력합니다. 다시는 Solidity에서 모의 계약을 작성하지 마십시오.
특징
계약 위조 const myFake = await smock.fake('MyContract'); const myOtherFake = await smock.fake(myContractFactory); const myOtherOtherFake = await smock.fake(myContractABI); const myOtherOtherOtherFake = await smock.fake(myContractInstance);
모든 계약 기능 조작 myFake.myFunction.returns(1234); myFake.myOtherFunction.returns({ myStructField: 1234 }); myFake.myOtherOtherFunction.returns((fnArg) => { return fnArg * 10 }); myFake.myOtherOtherOtherFunction.reverts(); // womp womp!
호출에 대한 어설션 만들기 expect(myFake.myFunction).to.have.been.calledOnce; expect(myFake.myFunction).to.have.been.calledWith(1234); expect(myFake.myFunction).to.have.been.calledBefore(myFake.myOtherFunction);
실제 계약으로 뒷받침되는 모형 만들기 const myMockFactory = await smock.mock('MyContract'); const myMock = await myMockFactory.deploy();// Does everything a fake can do! myMock.myFunction.returns(5678);
모의 객체 내부의 변수 조작 await myMock.setVariable('myVariable', 1234); await myMock.setVariable('myOtherVariable', { myStructValue: 1234 });
그리고 훨씬 더… 정말 다른 말이 필요합니까? 가서 사용해 보세요. 그것은 당신의 인생을 바꿀 것입니다. 진지하게.
https://github.com/defi-wonderland/smock
https://blog.oplabs.co/the-highly-optimistic-dev-blog-03-introducing-smock-v2/