c# - CollectionAssert.AreEquivalent 失败......无法弄清楚为什么

标签 c# unit-testing testing mocking

我有一个正在单元测试的注入(inject)接口(interface)。有问题的方法是有效的,但我正在尝试编写一个单元测试来确认返回的样本数据是完整和准确的。我的测试看起来正确,甚至结果看起来相同,但测试失败并显示“CollectionAssert.AreEquivalent 失败。预期集合包含 1 次出现。实际集合包含 0 次出现。”

[TestMethod]
    public void Should_Get_All_Amenities()
    {
        var amenitiesRep = _ninjectKernel.Get<IAmenityRepository>();

        var amenities = amenitiesRep.GetAmenities();

        var expected = new List<Amenity>
        {
            new Amenity() {Id = 1, Name = "Pool", Category = "resort"},
            new Amenity() {Id = 2, Name = "Hottub", Category = "resort"},
            new Amenity() {Id = 3, Name = "Steamroom", Category = "unit"}
        };

        Assert.IsNotNull(amenities);
        Assert.IsTrue(amenities.Count() == 3);
        CollectionAssert.AreEquivalent(expected, amenities);
    }

(相关代码来 self 的TestRepository)

        var amenities = new List<Amenity>
        {
            new Amenity() {Id = 1, Name = "Pool", Category = "resort"},
            new Amenity() {Id = 2, Name = "Hottub", Category = "resort"},
            new Amenity() {Id = 3, Name = "Steamroom", Category = "unit"}
        };

        var mockAmenitiesRep = new Mock<IAmenityRepository>();
        mockAmenitiesRep.Setup(_m => _m.GetAmenities()).Returns(amenities);
        Kernel.Bind<IAmenityRepository>().ToConstant(mockAmenitiesRep.Object);

我可以确认 CollectionAssert 中的所有数据都已正确填充,每个字段看起来都是 1 对 1 匹配,相同数量的对象,相同的对象类型,所以我只是不知道测试失败的原因。

(编辑:代码失败的行是 CollectionAssert)

最佳答案

这是因为 Amenity 是引用类型,所以 CollectionAssert.AreEquivalent 通过引用的地址检查相等性。由于预期集合中的项目与您从 GetAmenities() 方法获得的对象不同,因此它返回 false。您必须覆盖 Amenity 类中的相等比较器。

public override bool Equals(object obj)
{
    var other = obj as Amenity;
    if(other == null)
    {
        return false;
    }

    return Id = other.Id && Name == other.Name && Category == other.Category;
}

public override int GetHashCode()
{
    return Id.GetHashCode(); //assumes Id is immutable
}

更新:

请记住,这种方法不是很好,因为它会导致 Equality Pollution . Alexander Stepaniuk 在评论中发布了一个更好的选择。

关于c# - CollectionAssert.AreEquivalent 失败......无法弄清楚为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821628/

相关文章:

c# - RabbitMQ 和 C#

unit-testing - 修复现有的 JUnit 以使其在添加新代码后通过测试是否是一种好的做法?

ios - stub [[SomeClazz alloc] init] 不工作但接受的答案说它应该工作

c# - Assert.Fail 不会使测试失败?

javascript - Node : How to do nightmareJS e2e-testing on running docker application

c# - 当模型改变时引发 CanExecuteChanged

c# - (C#) 从 C++ DLL 获取 char ** 时出现 AccessViolationException

c# - LINQ to Entities 事务性能问题

testing - 使用 webdriver 上传文件

spring - 用另一个上下文中的模拟版本替换一个上下文中的 spring bean