C#

给定一个这样的函数:

public void AddItem( int itemId )
{
    if(itemId > 0)
    {
        Item i = new Item;
        i.ItemID = itemId
        i.DateChanged = DateTime.Today

        _repository.Items_Add(i);
        _repository.SaveChanges();
    }
}

Items_Add是一个无效函数,它只是检查实体框架以查看是否需要添加或附加/修改传递的项目并执行相应的作业。

我想使用Moq来验证“Items_Add”已被调用,并且与期望的对象一起。

但是,如果我在测试中这样做:

[TestMethod]
public void Assert_AddItem_AddsValidItem
{
    Mock<IRepository> repMock = new Mock<IRepository>();

    MyViewModel mvm = new MyViewModel(repMock.Object);

    mvm.AddItem(1);

    Item testItem = new Item();
    testItem.ItemID = 1;
    testItem.DateChanged = DateTime.Today;

    repMock.Verify(m => m.Items_Add(testItem), Times.Once);
}

该测试(并非意外)未能声称该功能未按预期调用。

我认为这是因为我在测试中创建的对象“testItem”与AddItem中创建的对象“i”不同,尽管它们在功能上是相同的。

如果这是正确的(请告诉我,如果不是),那么如何使用Moq来验证函数已被调用并按预期工作? 鉴于Items_Add不返回任何东西,我不确定是否可以使用Moq直接测试它(与“返回”构造相当的东西)。


It.Is也允许谓词,所以你可以这样做:

repMock.Verify(m => 
        m.Items_Add(It.Is<Item>(i => i.Id == testItem.Id)), Times.Once);

更一般地说,如果你想使用类自己的相等比较,你也可以使你的测试条件i.Equals(testItem)


如果您可以稍微“松开”测试,则可以验证Items_Add方法是否被任何Item调用:

repMock.Verify(m => m.Items_Add(It.IsAny<Item>()), Times.Once);
链接地址: http://www.djcxy.com/p/35341.html

上一篇: c#

下一篇: Call same method twice with different parameters