MSTest将Mock.Of <ifoo>的列表与Foo列表进行比较

时间:2018-01-31 19:59:43

标签: c# collections moq mstest

比较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一样环顾四周,很可能只是没有用正确的措辞进行搜索。

1 个答案:

答案 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的预期列表,在这种情况下不需要。