Weitere Informationen finden Sie auf der NSubstitute-Website.
NSubstitute ist als benutzerfreundlicher Ersatz für .NET-Mocking-Bibliotheken konzipiert.
Es ist ein Versuch, unser Verlangen nach einer spöttischen Bibliothek mit einer prägnanten Syntax zu stillen, die uns hilft, den Fokus auf die Absicht unserer Tests zu richten und nicht auf die Konfiguration unserer Testdoppel. Wir haben versucht, die am häufigsten benötigten Vorgänge offensichtlich und benutzerfreundlich zu gestalten, weniger übliche Szenarien erkennbar und zugänglich zu halten und gleichzeitig so viel natürliche Sprache wie möglich beizubehalten.
Perfekt für diejenigen, die neu im Testen sind, und für andere, die ihre Tests einfach mit weniger Lärm und weniger Lambdas schreiben möchten.
Wenn Sie Fragen, Funktionswünsche oder Feedback zu NSubstitute haben, melden Sie bitte ein Problem auf unserer Projektseite. Alle Fragen sind über unsere Projektseite willkommen, aber für Fragen im „How-to“-Stil können Sie auch StackOverflow mit dem Tag [nsubstitute] ausprobieren, was oft zu sehr guten Antworten von der größeren Programmier-Community führt. StackOverflow ist besonders nützlich, wenn sich Ihre Frage auch auf andere Bibliotheken bezieht, mit denen unser Team möglicherweise nicht so vertraut ist (z. B. NSubstitute mit Entity Framework).
Nehmen wir an, wir haben eine einfache Rechnerschnittstelle:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}Wir können NSubstitute bitten, eine Ersatzinstanz für diesen Typ zu erstellen. Wir könnten nach einem Stub, Mock, Fake, Spy, Test Double usw. fragen, aber warum sollten wir uns die Mühe machen, wenn wir nur eine Instanz ersetzen wollen, über die wir etwas Kontrolle haben?
_calculator = Substitute . For < ICalculator > ( ) ;virtual Mitgliedern von Klassen. Seien Sie vorsichtig beim Ersetzen von Klassen durch nicht-virtuelle Mitglieder. Weitere Informationen finden Sie unter „Erstellen eines Stellvertreters“.
Jetzt können wir unseren Stellvertreter anweisen, einen Wert für einen Anruf zurückzugeben:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;Wir können überprüfen, ob unser Stellvertreter einen Anruf erhalten hat und keine anderen:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;Wenn unsere Received()-Behauptung fehlschlägt, versucht NSubstitute uns zu helfen, was das Problem sein könnte:
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*)
Wir können auch mit Eigenschaften arbeiten, indem wir die Returns-Syntax verwenden, die wir für Methoden verwenden, oder einfach bei den einfachen alten Eigenschaftssettern bleiben (für Lese-/Schreibeigenschaften):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;NSubstitute unterstützt den Argumentabgleich zum Festlegen von Rückgabewerten und zum Bestätigen, dass ein Anruf empfangen wurde:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;Wir können den Argumentabgleich verwenden und eine Funktion an Returns() übergeben, um etwas mehr Verhalten aus unserem Ersatz herauszuholen (möglicherweise zu viel, aber das ist Ihre Entscheidung):
_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() kann auch mit mehreren Argumenten aufgerufen werden, um eine Folge von Rückgabewerten einzurichten.
_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" ) ) ;Schließlich können wir Ereignisse für unsere Substitute auslösen (leider schränkt C# das Ausmaß, in dem diese Syntax bereinigt werden kann, drastisch ein):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ; NSubstitute und seine Tests können mit Visual Studio, Visual Studio Code oder jedem anderen Editor mit .NET-Unterstützung kompiliert und ausgeführt werden. Beachten Sie, dass einige Tests [Pending] gekennzeichnet sind und derzeit nicht zum Bestehen vorgesehen sind. Daher empfiehlt es sich, Tests in der Kategorie „Ausstehend“ von Testläufen auszuschließen.
Es gibt auch Build-Skripte im Verzeichnis ./build für Befehlszeilen-Builds und CI-Konfigurationen im Projektstamm.
Um vollständige Builds durchzuführen, benötigen Sie außerdem Ruby, da der Jekyll-Gem zum Generieren der Website verwendet wird.
@fluffy-spoon/substitute auf NPM)