【问题标题】:Moq - re-create passes parameter for test起订量 - 重新创建通过参数进行测试
【发布时间】:2014-05-06 13:32:25
【问题描述】:

给定一个这样的函数:

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 是否需要添加或附加/修改并执行相应的工作。

我想使用最小起订量来验证“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”不同,即使它们在功能上相同。 p>

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

【问题讨论】:

标签: c# unit-testing mocking moq


【解决方案1】:

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

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

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

【讨论】:

  • +1,这比我的回答更适合用户。
【解决方案2】:

如果您对“放宽”测试感到满意,您可以验证是否调用了 Items_Add 方法,以及任何 Item

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

【讨论】:

  • 在这种情况下会很好,谢谢。但仍然有兴趣知道如何最好地处理我需要更明确地验证调用的类似情况。毫无疑问,它会在某个地方等待:)
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多