C# Moq-重新创建测试通过参数

C# Moq-重新创建测试通过参数,c#,unit-testing,mocking,moq,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

给定这样一个函数:

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

我想使用Moq来验证“Items\u 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);
}
[TestMethod]
公共无效断言\u AddItem\u AddsValidItem
{
Mock repMock=新建Mock();
MyViewModel mvm=新的MyViewModel(repMock.Object);
mvm附加项(1);
Item testItem=新项();
testItem.ItemID=1;
testItem.DateChanged=DateTime.Today;
repMock.Verify(m=>m.Items\u Add(testItem),Times.Once);
}
测试(并非意外)失败,声称函数未按预期调用

我假设这是因为我在测试中创建的对象“testItem”与在AddItem中创建的对象“I”不同,即使它们在功能上是相同的

如果这是正确的(如果不是,请告诉我),如何使用Moq来验证函数是否已被调用并且是否按预期工作?鉴于Items\u Add不返回任何内容,我不确定是否可以使用Moq直接测试它(使用与“Returns”构造等效的东西)。

如果您可以稍微“放松”测试,您可以验证是否调用了
Items\u Add
方法,使用任何
Item

repMock.Verify(m => m.Items_Add(It.IsAny<Item>()), Times.Once);
repMock.Verify(m=>m.Items\u Add(It.IsAny()),Times.one);

It.Is
还允许谓词,因此您可以执行以下操作:

repMock.Verify(m => 
        m.Items_Add(It.Is<Item>(i => i.Id == testItem.Id)), Times.Once);
repMock.Verify(m=>
m、 项目添加(It.Is(i=>i.Id==testItem.Id)),次/次);

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

在这种情况下就可以了,谢谢。但仍然有兴趣知道如何最好地处理类似的情况,在这种情况下,我需要更明确地验证调用。毫无疑问,它将在下面的某个地方等待:)看看这个问题如何解决您的问题:+1,这比我的答案更适合用户。