在测试中比较 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 处的元素不匹配。

在测试中比较 2 个列表

正如 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将仅检查两个引用是否引用同一对象