MoQ フレームワークは初めてです。MoQフレームワークを使用してコントローラーの単体テストを作成しています。これが私のテスト方法です。
var mockedItemDetail = new ItemDetail()
{
Name = null
};
var mockObject = new Mock<IItem>();
mockObject.Setup(x => x.GetItemDetail()).Returns(mockedItemDetail);
var result = myController.GetDetails() as ViewResult;
これが私のコントローラーメソッドです。
public ActionResult GetDetails()
{
var controllerItemDetail = new ItemDetail();
controllerItemDetail = _item.GetItemDetail();
controllerItemDetail.Name = "Changed Name";
return View("ViewName", controllerItemDetail);
}
テストが実行され、送信された mockedItemDetail と受信されたモデルの結果 controllerItemDetail をアサートしたいと考えています。
上記の場合、mockedItemDetail プロパティ「Name」は null で、controllerItemDetail プロパティ Name を「Changed Name」として受け取りました。
しかし、デバッグするたびに、テストメソッド GetDetails() を呼び出した後、
- 私の mockedItemDetail プロパティ Name も現在のスコープで「変更された名前」として更新されますが、その理由がわかりません。これは MoQ の実際の動作ですか?
編集内容
以下のモック リストで上記と同じケースを考えてみましょう。ここでは、モック オブジェクトの変更がすべてのコンテキストで更新されるわけではありません。つまり、mockedItemDetailList のリスト カウントは 0 のままで、controllerItemDetail のリスト カウントは、テスト メソッドの呼び出し後でも 1 です。なんで?
試験方法:
var mockedItemDetailList = new List<ItemDetail>();
var mockObject = new Mock<IItem>();
mockObject.Setup(x => x.GetListOfItemDetail()).Returns(mockedItemDetailList);
var result = myController.GetDetails() as ViewResult;
コントローラーの方法:
public ActionResult GetDetails()
{
var controllerItemDetail = new ItemDetail();
controllerItemDetail = _item.GetListOfItemDetail();
controllerItemDetail.Add(new ItemDetail(){
Name = "Changed Name"
});
return View("ViewName", controllerItemDetail);
}