モックオブジェクトへの期待に応えていないようです(Moq)
-
10-07-2019 - |
質問
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>
);
}
where AssertThat
は、多数のアサーションヘルパーを備えた独自のクラスです( Assert
クラスは拡張メソッドで拡張できないため...ため息。 ..)。
テストを実行すると、 repository.Verify()
行で MoqVerificationException
で失敗します:
Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod() threw exception: Moq.MockVerificationException: The following expectations were not met: IRepository r => r.SearchForContacts(value(System.String[]), False)
repository.Verify()
を削除すると、返されるモデルが null
であることを示すコレクションのアサートに失敗します。 query!= null
をデバッグして確認し、コードが実行される if
ブロックの一部に取り込まれることを確認しました。問題ありません。
なぜ機能しないのですか
解決
モックされたリポジトリに渡す配列( teststring.Split( '')
の結果)が実際に渡されるオブジェクトと同じオブジェクトではないためだと思いますSearchメソッド( query.Split( '')
の結果)。
セットアップコードの最初の行を次のように置き換えてみてください:
repository.Expect(r => r.SearchForContacts(
It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))
...は、モックに渡された配列の各要素を keywords
配列の対応する要素と比較します。
所属していません StackOverflow