詳細については、NSubstitute Web サイトをご覧ください。
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 ) ;
Received() アサーションが失敗した場合、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 構成もあります。
Web サイトの生成には jekyll gem が使用されるため、完全なビルドを行うには Ruby も必要になります。
@fluffy-spoon/substitute
)