Moq - 重新创建传递参数以进行测试

时间:2014-05-06 13:32:26

标签: c# unit-testing mocking moq

给定这样的函数:

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是一个void函数,它只检查实体框架以查看是否需要添加或附加/修改传递的Item并执行相应的工作。

我想使用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);
}

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

假设这是因为对象&#34; testItem&#34;我在测试中创建的与对象&#34; i&#34;不同。在AddItem中创建,即使它们在功能上完全相同。

如果这是正确的(如果不是,请告诉我),如何使用Moq验证函数是否已被调用并且按预期工作?鉴于Items_Add没有返回任何内容,我不确定是否可以使用Moq直接测试它(使用等同于&#34;返回&#34;构造的东西)。

2 个答案:

答案 0 :(得分:5)

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

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

更一般地说,如果你想使用班级自己的平等比较,你也可以使你的考试成绩为i.Equals(testItem)

答案 1 :(得分:3)

如果你可以稍微“放松”你的测试,你可以验证Items_Add方法是否被调用,任何Item

repMock.Verify(m => m.Items_Add(It.IsAny<Item>()), Times.Once);