モックで何らかの奇妙な動作が発生しています。モックオブジェクトを設定して特定の方法で動作させてから、私がテストしているオブジェクトと同じ方法で、メソッドが呼び出されなかったかのように反応します。モックオブジェクトへの期待が満たされていないようです(Moq)
I持って、私はテストをしようとしている以下のコントローラのアクション:
public ActionResult Search(string query, bool includeAll)
{
if (query != null)
{
var keywords = query.Split(' ');
return View(repo.SearchForContacts(keywords, includeAll));
}
else
{
return View();
}
}
私のユニットテストコード:AssertThat
はの束と自分だけのクラスです
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>
);
}
アサーションヘルパー(Assert
クラスは拡張メソッド... sigh ...で拡張できません)。
私がテストを実行すると、それはMoqVerificationException
で、repository.Verify()
行に失敗した:私はrepository.Verify()
を削除した場合
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)
、コレクションのアサートが返されたモデルがnull
であることを私に言って失敗しました。私はデバッグして、query != null
をチェックしました。コードが実行されているブロックif
の部分に取り込まれています。そこに問題はありません。
なぜこれは機能しませんか?
ありがとう!それは即刻トリックでした! =)私はMoqを読む必要があると思われます。具体的には、いつどのようにIt ...構造を使用するかについてです。 –