Moq で奇妙な動作が発生しています。特定の方法で動作するようにモック オブジェクトをセットアップし、テストしているオブジェクトでまったく同じ方法でメソッドを呼び出すという事実にもかかわらず、メソッドがあったかのように反応します。呼んだことはありません。
テストしようとしている次のコントローラー アクションがあります。
public ActionResult Search(string query, bool includeAll)
{
if (query != null)
{
var keywords = query.Split(' ');
return View(repo.SearchForContacts(keywords, includeAll));
}
else
{
return View();
}
}
私のユニットテストコード:
public void SearchTestMethod() // Arrange
var teststring = "Anders Beata";
var keywords = teststring.Split(' ');
var includeAll = false;
var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
repository
.Expect(r => r.SearchForContacts(keywords, includeAll))
.Returns(expectedModel)
.Verifiable();
// Act
var result = controller.Search(teststring, includeAll) as ViewResult;
// Assert
repository.Verify();
Assert.IsNotNull(result);
AssertThat.CollectionsAreEqual<Contact>(
expectedModel,
result.ViewData.Model as IEnumerable<Contact>
);
}
whereAssertThat
は、一連のアサーション ヘルパーを備えた単なる独自のクラスです (Assert
クラスは拡張メソッドで拡張できないため... ため息...)。
テストを実行すると、次のrepository.Verify()
行で失敗しMoqVerificationException
ます。
テスト メソッド MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod() 例外をスローしました: Moq.MockVerificationException: 次の期待が満たされませんでした: IRepository r => r.SearchForContacts(value(System.String[]), False)
を削除するrepository.Verify()
と、コレクション アサートが失敗し、返されたモデルが であることがわかりますnull
。私はそれをデバッグしてチェックし、コードが実行query != null
されるブロックの一部に取り込まれていることを確認しました。if
問題ありません。
なぜこれが機能しないのですか?