好的,所以我对单元测试相当新,到目前为止一切顺利。 我在这里简化了我的问题,但基本上我有以下内容:
[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);
}
但是测试失败了,测试不应该通过吗?我错过了什么?
答案 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.Equals
和Object.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();
}