gpt4 book ai didi

c# - 如何验证模拟对象是否已从模拟列表中删除?

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:08 24 4
gpt4 key购买 nike

我正在尝试为此方法编写单元测试:

public void AddItem( Cart cart, Item item )
{
var duplicates = cart.Items.OfType<Item>()
.Where( i => i.Key == item.Key )
.ToList();

foreach ( var duplicate in duplicates )
{
cart.Items.Remove( duplicate );
}

cart.Items.Add( item );
}

我想验证在添加新项之前是否从列表中删除了重复项(具有相同键的项)。此测试失败:

[TestMethod]
public void AddItemRemovesDuplicateItemsFirst()
{
const int itemKey = 123;

var cart = new Mock<Cart>();

var duplicate = new Mock<Item>();
duplicate.SetupGet( m => m.Key ).Returns( itemKey );

cart.SetupGet( m => m.Items ).Returns( new List<Item>
{
duplicate.Object
} );

var addItem = new Mock<Item>();
addItem.SetupGet( m => m.Key ).Returns( itemKey );

var task = GetTask();
task.AddItem( cart.Object, addItem.Object );

Assert.AreEqual( 1, cart.Object.Items.Count );
}

它失败了,因为 Count 是 2。另一方面,这个测试通过了:

[TestMethod]
public void AddItemRemovesDuplicateItemsFirst()
{
const int itemKey = 123;

var cart = new Mock<Cart>();

cart.SetupGet( m => m.Items ).Returns( new List<Item>
{
new Item
{
Key = itemKey
}
} );

var addItem = new Mock<Item>();
addItem.SetupGet( m => m.Key ).Returns( itemKey );

var task = GetTask();
task.AddItem( cart.Object, addItem.Object );

Assert.AreEqual( 1, cart.Object.Items.Count );
}

唯一的区别是第二个不为列表项使用 Mock 对象。

我试图避免像第二种方法那样实际创建对象。我怎样才能第一个通过?

最佳答案

由于您要测试的是与 Items 的交互,因此您将需要一个要测试的对象,无论它是具体实例(如您的第二种方法)还是模拟。

如果您使用模拟,则需要将其设置为在调用 OfType 时返回现有项目。然后您可以显式验证是否调用了 Remove,而不是检查 Count,像这样(未测试):

Items.Verify(
x => x.Remove(
It.Is<Item>(
item => item.Key == itemKey)));

话虽如此,我不禁想到应该将此功能封装在 Cart 中,而不会将 Item 列表暴露在该类之外进行操作。这也会使编写测试更容易。

关于c# - 如何验证模拟对象是否已从模拟列表中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22185166/

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