[.NET] Moq 대체하기

우노·2023년 8월 29일
0

오픈소스 관련 이슈를 해결하면서 패키지에 대한 이해없이 구조만 보고 코드를 수정했더니 잘 모르겠어서 정리하면서 공부해야겠다 !

Moq

The most popular and friendly mocking library for .NET

리드미를 인용하자면 .NET 프레임워크에서 가장 보편적인 Mock 라이브러리다.
오픈소스에서는 Given-When-Then 방식의 테스트케이스에서 mock 객체를 사용하기 위해 Moq을 활용하고 있었다.

Moq 대체가 필요한 이유

Privacy issues with SponsorLink, starting from version 4.20 #1372
대략 2주 전에 제기된 이슈인데 요약하자면 moq을 사용하는 개발자의 이메일을 클라우드 서비스로 전송한다는 내용이다. moq을 사용하던 개발자들이 보안면에서 큰 배신감을 느낀다며 더이상 쓰지 말라는 이슈가 쏟아지는 걸 볼 수 있다..
위 이슈로 멘토님께서 MoqNsubstitute로 바꾸자고 제안하셨다.

NSubstitute

리드미에서 설명하는 NSubstitute는 다음과 같다.

NSubstitute is designed as a friendly substitute for .NET mocking libraries.

We've tried to make the most frequently required operations obvious and easy to use, keeping less usual scenarios discoverable and accessible, and all the while maintaining as much natural language as possible.

사실 Moq 다음으로 유명한 .NET mock 라이브러리라서 Moq을 대체한다면 NSubstitute가 가장 적합할 것 같다.
검색했을 때 Moq 다음으로 등장한다.

Moq ➡ NSubstitute

위 링크를 참고하면 코드를 바꾸는 일은 어렵지 않다.

주요 수정 사항

Moq

var ui = new Mock<ISwaggerUI>();
ui.Setup(p => p.RenderAsync(It.IsAny<string>(), It.IsAny<OpenApiAuthLevelType>(), It.IsAny<string>())).ReturnsAsync(rendered);

NSubstitute

var ui = Substitute.For<ISwaggerUI>();
ui.RenderAsync(Arg.Any<string>(), Arg.Any<OpenApiAuthLevelType>(), Arg.Any<string>()).Returns(Task.FromResult(rendered));

위의 두 코드는 Moq을 NSubstitute로 대체한 예시이다.

여기서 알 수 있는 두 라이브러리의 특징을 비교해보자 !

  1. It.IsAny<T>()Arg.Any<T>()
    Moq - It / NSubstitute - Arg : 메소드 호출에서 특정 매개변수가 어떤 값이든 상관하지 않을 때 사용한다.

  2. ReturnsAsync()Returns(Task.FromResult())
    Moq에서는 ReturnsAsync()로 비동기 작업을 반환했지만 NSubstitute에서는 해당 메소드가 내장되어있지 않기 때문에 Task.FromResult()로 비동기 작업 결과를 받아서 Returns로 반환한다.

++ 객체 선언이나 Setup 거쳐서 설정 ➡ 바로 설정 은 대부분의 수정에 공통적으로 적용된다 !

결과

제 PR이 머지됐어요 ◝(・▿・)◜

패키지 안 지워서 PR 한 번 더 날리기

Azure의 오픈소스 레포에 기여자가 됐어여 신기하당


팀 이슈는 금방 해결했는데 개인 이슈가 해결이 안돼서 답답하다🫠
하나를 해결했더니 새로운 이슈가 등장해서 도저히 해결이 안된다..
몰라요 어떻게든 하겠지😑

profile
기록하는 감자

0개의 댓글