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();
}