Bob*_*way 3 c# unit-testing moq mocking
给定这样的函数:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
测试(不出意外)未能声明该功能未按预期调用.
我假设这是因为我在测试中创建的对象"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);
Run Code Online (Sandbox Code Playgroud)
更一般地说,i.Equals(testItem)如果要使用类自己的相等比较,也可以创建测试条件.
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |