.NET 조롱 프레임 워크 및 작동 방식에 대한 내 블로그 시리즈의 동반자 로서이 저장소는 .NET에 사용할 수있는 각 주요 조롱 프레임 워크를 사용하여 모의와 동일한 단위 테스트를 구현하려고 시도합니다.
이 프로젝트는 .NET 조롱 프레임 워크를 비교하거나 주어진 프레임 워크에 대한 구문 예를 참조하려는 모든 사람을위한 참조입니다. 그것은 철저한 참조가 아니며, 버그가없는 것이 아닙니다 (그러나 문제를 찾으면 알려주십시오).
테스트를 작성하려면 테스트가 필요한 코드가 필요합니다. 따라서, 나는 단위 테스트 (모의 포함)를 작성할 수있는 약간의 홀로 된 수업 인 LunchNotifier 를 만들었습니다.
뉴욕 사무실에서 일하는 오버 플로우 emplpoyees를 쌓는 데 제공되는 이점 중 하나는 사내 요리사로부터 무료 점심입니다. 요리사가 식사 준비를 완료하면 매일 사무실 직원에게 알림을 제공하여 음식을 이용할 수 있음을 알 수 있습니다.
CodeBeingTested Project에서 LunchNotifier 클래스는 우리의 주요 목표입니다.
이 클래스 테이크는 테스트를 수행하기 위해 조롱 해야하는 5 가지 외부 종속성이 있습니다.
INotificationService (생성자를 통해 주입)ILogger (생성자를 통해 주입)IEmployeeService (생성자를 통해 주입)IEmployee Objects)을 얻는 데 사용됩니다.IEmployee ( IEmployeeService 에서 반환)System.DateTime 주요 논리는 LunchNotifier.SendLunchtimeNotifications() 에 있습니다. 이 방법은 System.DateTime.Now 로의 인라인 호출이 포함되어 있으며, MOQ 또는 Rhinomocks와 같은 금기 된 프레임 워크로 조롱 할 수 없습니다.
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() 의 금기 프레임에 의해 대체 구현이 제공되며, 여기서 DateTime.Now 는 자체 방법으로 추출되어 모의로 대체 할 수 있습니다.
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
나머지 각 프로젝트는 각기 다른 조롱 프레임 워크를 사용하여 LunchNotifier 에 대한 유사한 단위 테스트 세트를 구현하려고 시도합니다.
모든 테스트는 Nuget 패키지를 통해 Nunit v3.10을 사용하여 작성됩니다.
경우에 따라 조롱 프레임 워크를 사용하여 테스트에 접근하는 여러 가지 방법이 있으므로 여러 접근 방식을 보여주기 위해 여러 가지 변형 테스트를 제공했습니다.
이 테스트는 전자 메일 알림을 선호하고 모의를 사용하여 LunchNotifier 가 점심이 준비 될 때 이메일을 보낼 수 있도록 모의 직원 "Bob"을 만듭니다.
이 테스트는 두 명의 모의 직원 인 "Bob"과 "Martha"를 생성하고 그 중 하나에 알림을 보내면 오류가 기록되어 나머지 직원이 통지를받지 못하게하지 않도록합니다.
이 테스트는 Nunit의 TestCase 구문을 사용하여 오후 1시 이전과 1pm 이후에 하나씩 하나의 테스트 사례를 실행하여 적절한 알림 템플릿을 시간에 따라 사용하도록합니다.
구속되지 않은 프레임 워크의 경우 DateTime.Now 직접 제어하여 테스트의 입력 시간을 반환 할 수 있지만 제한된 프레임 워크는 할 수 없으므로 DateTime.Now 으로 호출을 추출해야합니다. 따라서 SendLunchtimeNotifications_DateTimeSeam 변형이 필요합니다.
유형 : 제약
프로젝트 : https://github.com/moq/moq4/wiki/quickstart
Nuget : https://www.nuget.org/packages/moq/
유형 : 제약
프로젝트 : https://github.com/hibernating-rhinos/rhino-mocks
Nuget : https://www.nuget.org/packages/rhinomocks
경고 : Rhinomocks는 효과적으로 죽은 프로젝트이며 .NET Core와 같은 .NET의 향후 변화를 지원하지 않을 것입니다. 이 프레임 워크를 아직 사용하지 않는다면이 프레임 워크를 사용하기 시작하지 않는 것이 좋습니다.
이 테스트를 실행하려면 VS2017 Enterprise (또는 Equiv)가 설치되어 있어야합니다.
유형 : 제약
프로젝트 : http://nsubstitute.github.io/
Nuget : https://www.nuget.org/packages/nsubstitute
유형 : 제한되지 않은
Microsoft Fakes는 Visual Studio 2017 Enterprise 또는 Visual Studio 2015 Ultimate의 일부로 제공되며 Spate 구성 요소로 제공되지 않습니다.
Fakes는 AssertWasCalled Style 검증을 기본적으로 지원하지 않으므로 추가 Nuget 패키지 (내가 기여한)를 사용하여 해당 기능을 제공합니다. Fakes.contrib / Nuget.
유형 : 제한되지 않은
제품 정보 : https://www.typemock.com/isolator
이 제품은 제한되지 않은 조롱을하기 위해 유료 라이센스 (무료 15 일 평가판이 가능)가 필요합니다. Typemock은 무료 커뮤니티 라이센스를 제공하여 이와 같은 프로젝트를 수행 할 수 있도록 충분히 좋았습니다.