在测试中比较2个列表

时间:2014-12-18 12:58:03

标签: c# unit-testing

我正在尝试创建一个测试存根来检查AddProduct方法是否有效。

我从数据库中获取所有产品的列表

List<Product> ProductsBeforePlusNewProd = new ProductsBL().getAllProducts().ToList();

填充新产品以添加

 Product newProduct = new Product();
        newProduct.ProductName = ...

将newProduct添加到数据库

new ProductsBL().addProduct(newProduct);

将相同的产品添加到ProductBeforePlusNewProd列表中,该列表将保留以前的产品和新产品 - (这是预期的结果)

将产品添加到数据库后获取整个列表

List<Product> ProductsAfter = new ProductsBL().getAllProducts().ToList();

然后失败

CollectionAssert.AreEqual(ProductsBeforePlusNewProd, ProductsAfter);

我在这里缺少什么?这是我的第一个测试存根

编辑:错误消息:CollectionAssert.AreEqual失败。 (索引0处的元素不匹配。)

4 个答案:

答案 0 :(得分:2)

正如pascx64已经显示的那样,您可以在IEquatable处实施Product。但是,如果您不想(或无法)更改Product的实施,您可以实施IComparer

    public class ProductComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            // compare the two objects
        }
    }

你可以使用

CollectionAssert.AreEqual(ProductsBeforePlusNewProd, ProductsAfter, new ProductComparer());

答案 1 :(得分:0)

这将比较列表实例,而不是项目。我建议你使用IEnumerable.SequenceEquals(你的项目必须实现等于)

答案 2 :(得分:0)

如果两个集合在相同的顺序和数量中具有相同的元素,则它们是相等的。如果元素的值相等,则元素相等,而不是它们引用相同的对象。默认情况下,使用Equals比较元素的值。  你确定两个集合中的元素是相同的吗?您需要在Product类中实现IEquatable。

答案 3 :(得分:0)

我认为您需要在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仅检查两个引用是否引用同一个对象