자세한 내용은 NSubstitute 웹사이트를 방문하세요.
NSubstitute는 .NET 모의 라이브러리를 대체하기 위해 설계되었습니다.
이는 테스트 더블의 구성보다는 테스트 의도에 초점을 맞추는 데 도움이 되는 간결한 구문으로 모의 라이브러리에 대한 우리의 갈망을 충족시키려는 시도입니다. 우리는 가장 자주 필요한 작업을 명확하고 사용하기 쉽게 만들고 덜 일반적인 시나리오를 검색하고 액세스할 수 있도록 유지하는 동시에 가능한 한 많은 자연어를 유지하려고 노력했습니다.
테스트를 처음 접하는 사람들과 더 적은 노이즈와 더 적은 람다로 테스트를 작성하고 싶은 사람들에게 적합합니다.
NSubstitute에 대한 질문, 기능 요청 또는 피드백이 있는 경우 프로젝트 사이트에 문제를 제기해 주세요. 모든 질문은 우리 프로젝트 사이트를 통해 환영합니다. 그러나 "방법" 스타일의 질문에 대해서는 [nsubstitute] 태그를 사용하여 StackOverflow를 시도해 볼 수도 있습니다. 이는 종종 대규모 프로그래밍 커뮤니티로부터 매우 좋은 답변으로 이어집니다. StackOverflow는 귀하의 질문이 우리 팀이 익숙하지 않을 수 있는 다른 라이브러리(예: Entity Framework를 사용한 NSubstitute)와도 관련되어 있는 경우 특히 유용합니다.
기본 계산기 인터페이스가 있다고 가정해 보겠습니다.
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}NSubstitute에 이 유형에 대한 대체 인스턴스를 생성하도록 요청할 수 있습니다. 스텁, 모의, 페이크, 스파이, 테스트 더블 등을 요청할 수 있지만, 우리가 제어할 수 있는 인스턴스를 대체하고 싶을 때 왜 굳이 귀찮게 해야 할까요?
_calculator = Substitute . For < ICalculator > ( ) ;virtual 멤버에서만 제대로 작동합니다. 가상 멤버가 아닌 클래스로 대체할 때는 주의하세요. 자세한 내용은 대체 만들기를 참조하세요.
이제 우리는 호출에 대한 값을 반환하도록 대체에게 지시할 수 있습니다.
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;대리인이 전화를 받았는지, 다른 사람은 받지 않았는지 확인할 수 있습니다.
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;Receiverd() 어설션이 실패하면 NSubstitute는 문제가 무엇인지에 대한 도움을 제공하려고 합니다.
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
메소드에 사용하는 Returns 구문을 사용하여 속성 작업을 수행하거나 일반 기존 속성 설정자(속성 읽기/쓰기용)를 사용할 수도 있습니다.
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;NSubstitute는 반환 값을 설정하고 호출이 수신되었는지 확인하기 위한 인수 일치를 지원합니다.
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;인수 일치를 사용하고 Returns()에 함수를 전달하여 대체 항목에서 더 많은 동작을 얻을 수 있습니다(아마도 너무 많을 수 있지만 이것이 귀하의 요청입니다).
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;Returns()는 여러 인수를 사용하여 호출하여 일련의 반환 값을 설정할 수도 있습니다.
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;마지막으로 대체 항목에 대해 이벤트를 발생시킬 수 있습니다(불행히도 C#에서는 이 구문을 정리할 수 있는 범위가 크게 제한됩니다).
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ; NSubstitute 및 해당 테스트는 Visual Studio, Visual Studio Code 또는 .NET을 지원하는 기타 편집기를 사용하여 컴파일하고 실행할 수 있습니다. 일부 테스트는 [Pending] 으로 표시되어 현재로서는 통과할 수 없다는 점에 유의하세요. 따라서 보류 카테고리의 테스트를 테스트 실행에서 제외하는 것이 좋습니다.
./build 디렉터리에는 명령줄 빌드를 위한 빌드 스크립트가 있고 프로젝트 루트에는 CI 구성이 있습니다.
전체 빌드를 수행하려면 Ruby도 필요합니다. 웹사이트를 생성하는 데 jekyll gem이 사용되기 때문입니다.
@fluffy-spoon/substitute )