NUnit比较两个列表

时间:2013-11-08 14:36:57

标签: c# nunit generic-list

好的,所以我对单元测试相当新,到目前为止一切顺利。 我在这里简化了我的问题,但基本上我有以下内容:

[Test]
public void ListTest()
{
    var expected = new List<MyClass>();
    expected.Add(new MyOtherClass());
    var actual = new List<MyClass>();
    actual.Add(new MyOtherClass());
    Assert.AreEqual(expected,actual);
    //CollectionAssert.AreEqual(expected,actual);
}

但是测试失败了,测试不应该通过吗?我错过了什么?

6 个答案:

答案 0 :(得分:31)

如果您要比较两个列表,则应使用collection constraints进行测试。

Assert.That(actual, Is.EquivalentTo(expected));

此外,在您的课程中,您需要覆盖Equals方法,否则如gleng所述,列表中的项目仍将根据参考进行比较。

简单覆盖示例:

public class Example
{
    public int ID { get; set; }

    public override bool Equals(object obj)
    {
        return this.ID == (obj as Example).ID;
    }
}

答案 1 :(得分:10)

使此测试起作用的一种非常简单的方法是仅创建一次MyOtherClass实例。这样,当比较两个列表中的项目时,它们将是#34;相等&#34; (因为它们引用了同一个对象)。如果您这样做,CollectionAssert将正常工作。

[Test]
public void ListTest()
{
    var thing = new MyOtherClass();

    var expected = new List<MyClass>();
    expected.Add(thing);

    var actual = new List<MyClass>();
    actual.Add(thing);

    CollectionAssert.AreEqual(expected,actual);
}

如果你不这样做,你需要在IEquatable<MyOtherClass>中实施MyOtherClass或覆盖Equals来定义是什么让该类的两个实例成为& #34;相同的&#34;

答案 2 :(得分:7)

我将评论转换为请求回答。

嗯,这失败了,因为AreEqual使用了引用比较。为了使其工作,您需要进行价值比较(您自己的自定义比较)。

通过实施IEquatable接口,您可以做到这一点。并且在您实施此界面时请记住,必须覆盖Object.EqualsObject.GetHashCode以获得一致的结果。

.Net框架支持这样做而不实现IEquatable你应该做的IEqualityComparer,但nunit应该有一个方法,将其作为一个过载。但是我不确定“nunit”。

答案 3 :(得分:5)

尝试更具体地了解您要实现的目标。明确告诉您要比较整个序列将解决问题。我个人不会依赖NUnit花哨的功能来确定AreEqual的意思。 E.g。

Assert.IsTrue(actual.SequenceEqual(expected));

答案 4 :(得分:2)

来自Nunit documentation

  

从2.2版开始,还对比较单维数组进行了特殊规定。如果两个数组的长度相同且每个相应的元素相等,则Assert.AreEqual将两个数组视为相等。注意:目前不支持多维数组,嵌套数组(数组数组)和其他集合类型(如ArrayList)。

你有一个对象列表......所以它与比较2个整数不同。 您应该做的是比较列表中的所有对象...(尝试将列表转换为数组......实际上可能有效:))


正如我所说的(以及其他大多数人),您可能需要覆盖Equals。这是关于如何操作的MSDN页面(Covers Equals,== operator和GetHashCode)。

与更多信息类似: [比较平等-两物体合的NUnit之间-]
Compare equality between two objects in NUnit

答案 5 :(得分:1)

如果您无法修改课程,那么此示例可能会有所帮助:

[Test]
public void Arrays_Should_Be_Equal()
{
    MyClass[] array1 = GetTestArrayOfSize(10);
    MyClass[] array2 = GetTestArrayOfSize(10);

    // DOESN'T PASS
    // Assert.That(array1, Is.EquivalentTo(array2));

    Func<MyClass, object> selector = i => new { i.Property1, i.Property2 };
    Assert.That(array1.Select(selector), Is.EquivalentTo(array2.Select(selector)));
}

private MyClass[] GetTestArrayOfSize(int count)
{
    return Enumerable.Range(1, count)
        .Select(i => new MyClass { Property1 = "Property1" + i, Property2 = "Property2" + i }).ToArray();
}