2017-07-07 65 views
3

我是新来的起订量的框架。我使用的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属性“名称”具有零和接收controllerItemDetail属性名称为“更名”。

但每当我调试,调用测试方法GetDetails(),

  1. 我mockedItemDetail属性名称也被更新为当前范围“更名”,我不知道为什么之后?这是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); 
} 
+2

你返回一个特定的对象'x.GetItemDetail('。为什么它不会在当前的情况下更新?该对象正在'controllerItemDetail.Name =“更改名称”;'修改。这是预期的行为。 – FrankerZ

+0

Mockling是一种罪过 – MickyD

+0

请找编辑的内容@FrankerZ – Praveen

回答

2

你有一个非常具体的目标:

var mockedItemDetail = new ItemDetail() 
{ 
    Name = null 
}; 

当你调用mockObject.Setup(x => x.GetItemDetail()).Returns(mockedItemDetail);,您传回参考mockItemDetail。该对象的任何更改都将在所有情况下更新。

快速跟进。有它空白new ItemDetail()每次回来,你可以简单地使用Returns()拉姆达方法:)

mockObject.Setup(x => x.GetItemDetail()).Returns(() => new ItemDetail() 
{ 
    Name = null 
}); 
+0

我同意你的观点。但请向我解释编辑内容的原因? – Praveen

+0

为了给你一个选择,如果你想在每一'GetItemDetail()'返回一个新的实例,并不会影响的可能返回'ItemDetail()'的其他版本。 – FrankerZ

+0

看起来你只是提供了一个替代解决方案。但我想知道为什么同一个实例在第一种情况下更新,而不是在第二种情况下更新(列表中包含)? – Praveen