C# NUnit正在比较两个列表

C# NUnit正在比较两个列表,c#,nunit,generic-list,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());

好的,所以我对单元测试还比较陌生,到目前为止一切都很顺利。 我在这里简化了我的问题,但基本上我有以下几点:

[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);
}
[测试]
公共空列表测试()
{
var expected=新列表();
应为。添加(新MyOtherClass());
var实际值=新列表();
添加(新的MyOtherClass());
断言.AreEqual(预期、实际);
//收款资产等于(预期、实际);
}
但是考试失败了,考试不应该通过吗?我错过了什么?

来自Nunit:

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

您有一个对象列表。。。所以这和比较两个整数不一样。 您应该做的是比较列表中的所有对象。。。(尝试将列表转换为数组…实际可能有效:))


正如我所说(以及大多数其他人),您可能需要覆盖Equals。这是关于如何做的页面(包括Equals、==运算符和GetHashCode)

更多信息请参见: [比较nunit中两个对象之间的相等性]

()

试着对你想要实现的目标更具体一点。显式地告诉您要比较整个序列将解决问题。我个人不会依靠NUnit的奇特功能来确定你所说的“平等”是什么意思。例如

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

让这个测试工作的一个非常简单的方法是只创建一次
MyOtherClass
实例。这样,当比较两个列表中的项目时,它们将“相等”(因为它们引用相同的对象)。如果您这样做,
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);
}
[测试]
公共空列表测试()
{
var thing=newmyotherclass();
var expected=新列表();
预期。添加(事物);
var实际值=新列表();
实际添加(事物);
收款资产等于(预期、实际);
}

如果不这样做,则需要在
MyOtherClass
中实现
IEquatable
,或重写
Equals
以定义是什么使该类的两个实例“相同”。

如果要比较两个列表,则应使用test-using

另外,在类中,您需要重写Equals方法,否则就像gleng所说的那样,列表中的项目仍将基于引用进行比较

简单覆盖示例:

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

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

我将我的评论转换为应要求回答

好吧,这失败了,因为
AreEqual
使用了引用比较。为了让它工作,你需要价值比较(你自己的自定义比较)

通过实现接口,您几乎可以做到这一点。请记住,在实现此接口时,必须重写
Object.Equals
Object.GetHashCode
,以获得一致的结果


.Net framework支持在不实现
IEquatable
的情况下执行此操作。您需要的是可以实现此功能的,但是
nunit
应该有一个将此作为重载的方法。不过,我对“nunit”不太确定。

如果您无法修改类,则此示例可能会有所帮助:

[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();
}
[测试]
公共空数组应等于()
{
MyClass[]array1=GetTestArrayOfSize(10);
MyClass[]array2=GetTestArrayOfSize(10);
//没有通过
//断言(array1,等于(array2));
Func selector=i=>new{i.Property1,i.Property2};
Assert.That(array1.Select(selector),Is.EquivalentTo(array2.Select(selector));
}
私有MyClass[]GetTestArrayOfSize(整数计数)
{
返回可枚举的范围(1,计数)
.Select(i=>newmyclass{Property1=“Property1”+i,Property2=“Property2”+i});
}

在注释中使用CollectionAssert,然后在MyOtherClass上实现IComparable接口。NUnit不知道如何比较这些对象,除非它们符合相等接口。@vcsjones我想你的意思是
IEquatable
而不是
IComparable
或重写Equalsmethod@SriramSakthivel你是对的,如果你把它作为一个答案,我会接受它。谢谢。是的,IEquatable是正确的接口。@SOfanatic作为答案添加:)它不会,除非覆盖Equals。如果覆盖
Equals
,则还应覆盖
GetHashCode
。记录NUnit 3处理集合约束的方式。注意
equivalento
比较集合。如果顺序/顺序很重要,那么如果您想在IDE中获得更多信息,请使用NUnit特有的功能
[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();
}