ユニットテストでMoqをいじり始めたばかりですが、ユニットテストに合格するという問題があります。そうすべきではないと思います。
2つのオブジェクトがあります。1つはデータをキューにディスパッチし、もう1つINotifier
はディスパッチャーが失敗した場合に呼び出される実装です。これらは次のようになります(簡潔にするために切り詰めます)。
public class EmailNotifier : INotifier
{
public void Notify(string message)
{
// sends the notification by email
}
}
public class Despatcher
{
public void Despatch(int batchNumber, INotifier failureNotifier)
{
try
{
if (batchNumber.Equals(0)) throw new InvalidOperationException("Error message");
}
catch (InvalidOperationException ex)
{
failureNotifier.Notify(ex.ToString());
throw ex;
}
}
}
私はユニットテストを行って、失敗したときに提供された(私はモックしている)で呼び出されているDespatcher
ことを具体的に確認しています( 0バッチ番号を渡すことで意図的に失敗を強制しています)。私は次のようにモックを設定しました:Notify
INotifier
Despatcher
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void Despatcher_notifies_on_failure()
{
var mockNotifier = new Mock<EmailNotifier>();
mockNotifier.Setup(n => n.Notify(It.IsAny<string>())).Verifiable();
var despatcher = new Despatcher();
despatcher.Despatch(0, mockNotifier.Object);
mockNotifier.Verify(n => n.Notify(It.IsAny<string>()), Times.Once());
}
これはテストに合格します。これは、バッチ番号が0の場合に例外が発生しINotifier
、呼び出しが発生するためNotify
です(テストを実行すると、すべてが期待どおりに機能します)。
それで、私は行をコメントアウトしてfailureNotifier.Notify(ex.ToString())
、テストを再度実行します-問題なく合格しますか?Moqを使用してから約2時間しか経っていないため、セットアップと検証が正しく行われているかどうかはわかりませんが、これは正しく理解していると思いましたが、少しばかり気になりました。失敗した場合に呼び出されることを特に確認したいので、このテストは失敗することを期待していNotify
ます-誰かがここで明らかに間違っているものを見ることができますか?いつものようにあなたの助けを事前に感謝します。