stalim17

Posted on May 23, 2023Read on Mirror.xyz

Introducing Smock v2-OP LABS BLOG [KOR]

Solidity 개발자: Smock v2를 만나보세요 . Solidity 모킹 라이브러리 . _ Optimism 과 DeFi Wonderland 의 환상적인 팀 간의 협력 .

스마트 계약 테스트는 역사적으로… 어려웠습니까? 어렵지 않다면 혼란스러울 뿐입니다. Solidity 초기에 계약을 테스트하는 가장 좋은 방법은 모든 테스트를 수행할 책임이 있는 다른 계약을 작성하는 것이 었습니다. 이것은 약 20가지의 다른 이유로 끔찍한 생각이었습니다. 가장 중요한 몇 가지를 언급하겠습니다.

  1. Solidity에서 테스트 코드를 작성해야 했습니다.

  2. 테스트를 변경하기 위해 테스트 계약을 다시 컴파일해야 했습니다.

  3. 테스트 계약과 대상 계약은 동일한 체인 상태를 공유했습니다.

관련된 모든 사람들에게 엄청난 시간 낭비였습니다. 그 당시에는 스마트 계약이 비교적 단순했기 때문에 대부분 괜찮 았습니다 . 그러나 물론 이러한 테스트 인프라 부족은 계약이 매우 복잡할 수 없음을 의미했습니다.

시간이 좀 걸렸지만 마침내 Truffle과 같은 JavaScript 테스트 프레임워크를 사용하여 테스트 환경을 크게 개선했습니다. 우리는 chai 및 mocha와 같은 도구의 멋진 기능 중 일부를 물려받았습니다. 우리의 테스트는 적어도 어느 정도는 읽을 수 있게 되었습니다. 실제로 합리적인 양의 복잡성으로 계약 시스템을 구축할 수 있습니다.

Hardhat은 결국 Truffle이 먼저 수행한 많은 작업을 개선했습니다. 그러나 Hardhat의 주요 발전은 플러그인 시스템이었습니다. 이제 개발자는 Truffle로는 불가능했던 테스트 환경을 쉽게 조작할 수 있게 되었습니다.

그러나이 모든 개선 과정에서 Solidity 개발자는 여전히 매우 구체적인 기능을 단위 테스트 할 수 있도록 Solidity로 작성된 모의 계약 이라는 절대적으로 끔찍한 패턴을 처리해야했습니다 . 내 말은, 정말??? 이것이 그렇게 나쁜 몇 가지 이유는 다음과 같습니다.

  1. Solidity에서 테스트 코드를 작성해야 합니다.

  2. 테스트를 변경하려면 테스트 계약을 다시 컴파일해야 합니다.

  3. 테스트 계약과 대상 계약은 동일한 체인 상태를 공유합니다.

???

응. 그래도. 우리는 그것을 고쳤습니다.

소개: 작업복 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/