私は私のテストで以下の構造を持っています。これは、特定のログが正しい複雑な引数オブジェクトで呼び出されていることをテストすることを目的としています。logThing にはメソッドがあります。
void AddEntry(LogEntry);
そのため、When..Do を使用して例外をスローさせています。
public void UnitTest()
{
// Arrange
ILogThing logThing = Substitute.For<ILogThing>()
SystemUnderTest system = new SystemUnderTest(logThing);
List<LogEntry> actualEntries = new List<LogEntry>();
LogEntry expectedEntry = GetSomeTestData();
logThing.When(
lt => lt.AddEntry(Arg.Do<LogEntry>(r => actualEntries.Add(r)))).Do(
call => { throw new InvalidOperationException("testMessage"); });
// Act
try
{
system.DoSomethingWhichLogs(someArgs)
}
catch(WrappedException ex)
{
// Assert
Assert.AreEqual(1, actualEntries.Count);
Assert.AreEqual(actualEntries[0], expectedEntry);
}
}
ただし、Arg.Do() への予想される呼び出しは、このセットアップでは発生しません。
catch ブロックにブレークポイントを配置し、Visual Studio のイミディエイト ウィンドウを使用して、logThing で RecievedCalls<>() を呼び出しました。正しい引数を使用して logThing を 1 回呼び出した記録があります。Arg.Do だけです。 When..Do ブロックが終了した後にのみ実行されるようです。これは明らかに、When..Do を投入しているため、到達しないことを意味します。
NSubstitute がこのような方法で呼び出しを行うとは本当に予想していませんでした。これは予想される動作ですか? もしそうなら、このように入ってくる引数をテストするために私ができることはありますか、それとも引数のチェックをメインの When..Do ブロックに入れる必要がありますか (読みにくくなります)?
テスト中のシステムは、logEntry と一緒にラップするなど、例外に対してさまざまなことを行うため、これらすべてのチェックを 1 つのテストで行うと便利です。2 つの別々のテストに分割することを考えましたが、実現しました私がそれをした場合、間違ったラップされた出力がどこから来ているのかを簡単に突き止めることができませんでした(logEntryを最初に生成した部分、またはそれをラップした部分のいずれかである可能性があります)一方、このパターンを使用して確認できますlogThing は私が期待するものを受け取っています。それでも、それを行うためのより良い方法があれば、私は確かに提案を受け入れます.