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,这比我的答案更适合用户。