gpt4 book ai didi

c# - 最小起订量 - 重新创建用于测试的传递参数

转载 作者:行者123 更新时间:2023-11-30 13:57:01 26 4
gpt4 key购买 nike

给定这样一个函数:

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 是一个空函数,它只是检查 Entity Framework 以查看是否需要添加或附加/修改传递的 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);
}

测试(并非意外)失败,声称函数未按预期调用。

假设这是因为我在测试中创建的对象“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)

关于c# - 最小起订量 - 重新创建用于测试的传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23496184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com