比较Moq Foo列表与预期列表
的正确方法是什么我相信这个问题的答案将与Moq对象有关,但我尝试了一些Assert的变体,并且具有相同的一般结果。
var moq = new List<IFoo>
{
Mock.Of<IFoo>(f => f.Description == "thing one" && f.Price == 0m),
Mock.Of<IFoo>(f => f.Description == "thing two" && f.Price == 0m),
Mock.Of<IFoo>(f => f.Description == "thing three" && f.Price == 0m),
};
var concrete = new List<IFoo>
{
new Foo{ Description = "thing one", Price = 0m},
new Foo{ Description = "thing two", Price = 0m },
new Foo{ Description = "thing three", Price = 0m },
};
//both fail
CollectionAssert.AreEqual(moq, concrete);
CollectionAssert.AreEquivalent(moq, concrete);
}
另外值得注意的是,我正在覆盖public override bool Equals(object obj)
这是一个失败的测试,代表了我遇到的类似场景。我相信如果这个过去那么我将试图解决的问题。
我和Google一样环顾四周,很可能只是没有用正确的措辞进行搜索。
答案 0 :(得分:2)
基于@Nkosi的评论和一些额外的挖掘
moq预期列表 NO NEED 。只需将列表向下倾斜到IFoo并预先填充新的Foo。您可能需要覆盖Equals
IFoo
方法
var moq = new List<IFoo>
{
new Foo{ Description = "thing one", Price = 0m},
new Foo{ Description = "thing two", Price = 0m },
new Foo{ Description = "thing three", Price = 0m },
};
这种方法都将通过
CollectionAssert.AreEqual
CollectionAssert.AreEquivalent
值得注意的是,如果我将预期列表作为moq列表并且交换了断言,则会发生以下情况
CollectionAssert.AreEqual(concrete, moq);//pass
CollectionAssert.AreEquivalent(concrete, moq);//fail
当断言AreEqual时,为预期对象调用is equal方法 当断言AreEquivalent时,为moq和返回的列表调用相等的方法。
总的来说,我不确定为什么我是moqing的预期列表,在这种情况下不需要。