我正在尝试创建一个测试存根来检查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处的元素不匹配。)
答案 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
仅检查两个引用是否引用同一个对象