在测试中比较 2 个列表
本文关键字:列表 比较 测试 | 更新日期: 2023-09-27 18:34:33
我正在尝试制作一个测试存根来检查 AddProduct 方法是否有效。
我正在从数据库中获取所有产品的列表
List<Product> ProductsBeforePlusNewProd = new ProductsBL().getAllProducts().ToList();
填充要添加的新产品
Product newProduct = new Product();
newProduct.ProductName = ...
将新产品添加到数据库
new ProductsBL().addProduct(newProduct);
将相同的产品添加到列表中 产品之前加新产品 这将保存以前的产品和新的产品 - (这是预期的结果(
将产品添加到数据库后获取整个列表
List<Product> ProductsAfter = new ProductsBL().getAllProducts().ToList();
然后这失败了
CollectionAssert.AreEqual(ProductsBeforePlusNewProd, ProductsAfter);
我在这里错过了什么?这是我的第一个测试存根
编辑:错误消息:CollectionAssert.AreEqual失败。(索引 0 处的元素不匹配。
正如 pascx64 已经显示的那样,您可以在 Product
实现IEquatable
。但是如果你不想(或不能(改变Product
的实现,你可以实现一个IComparer
:
public class ProductComparer : IComparer
{
public int Compare(object x, object y)
{
// compare the two objects
}
}
你可以比使用
CollectionAssert.AreEqual(ProductsBeforePlusNewProd, ProductsAfter, new ProductComparer());
这将比较列表实例,而不是项目。我建议你使用IEnumerable.SequenceEquals(你的项目必须实现equals(
如果两个集合具有相同顺序和数量的相同元素,则它们相等。如果元素的值相等,则元素相等,如果它们引用同一对象,则元素相等。默认情况下,元素的值使用等于进行比较。 您确定两个集合中的元素相等吗?您需要在产品类中实现 IEquatable。
我认为你需要在你的Product
类中实现IEquatable:
public class Product : IEquatable
{
public string ProductName;
public bool Equals( object o )
{
Product other = o as Product;
if( other == null )
return false;
return ProductName == other.ProductName;
}
}
默认情况下,CollectionAssert.AreEquals
将仅检查两个引用是否引用同一对象