在NUnit 2.6.4中,AreEqual
是否测试引用相等或值相等?我很困惑,在我的一些测试中,它似乎在测试价值相等:
let result = xml |> objectProvider.Parse |> parseClassificationsFromList
let expectedResults = [[Classification (Id "_511175266", [], Primary)]]
Assert.AreEqual(expectedResults, result)
但在某些情况下:
let parsedXML = xml |> objectProvider.Parse
let results = funds parsedXML
let fS = XElement.Parse("""
<sectiondiv>
<p>.....</p>
</sectiondiv>""", LoadOptions.PreserveWhitespace)
let f = [|NewFunds(None, objectProvider.Sectiondiv(fS))|]
let expected = f;
let result = results;
Assert.AreEqual(expected, result);
我被告知:
Expected and actual are both <Funds[1]>
Values differ at index [0]
这表明它正在测试引用相等性。我完全糊涂了!在后一种情况下,我知道这些值是相同的,因为如果我将预期结果和实际结果转换为JSON,它们就会匹配。
NewFunds
定义为:
type Funds =
| NewFunds of Specificity option * objectProvider.Sectiondiv
对于基本相等,NUnit使用所提供类型实现的任何相等定义,通常通过重写Equals
,但可能通过实现IEQuatable<T>
接口。如果对象没有做这两件事,那么引用类型的引用相等,值类型的值相等。
除了。。。
NUnit对集合的相等性有自己的定义。根据错误消息,看起来NewFunds
对象就是这样的。在这种情况下,NUnit将等式实现为集合中每个成员的等式,按顺序执行。
注意:这比这更复杂,有很多特殊情况,但我认为我列出的是影响您的示例的情况。