簡體   English   中英

使用Moq:Mock對象自動更新?

[英]Using Moq : Mock object update automatically?

我是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()后,

  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);
}

你有一個非常具體的對象:

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

當你調用mockObject.Setup(x => x.GetItemDetail()).Returns(mockedItemDetail); ,您將返回對mockItemDetail的引用。 對該對象的任何更改都將在所有上下文中更新。

快速跟進。 要讓它每次都返回一個空白的new ItemDetail() ,你可以簡單地使用Returns()的lambda方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM