2012-10-08 72 views
2

平等比較如何爲Func工作?我已經減少了我的問題的複雜性,這些單元測試:Func NUnit平等比較

[Test] 
public void Will_Pass() 
{ 
    Func<string> func =() => "key"; 
    Assert.That(func, Is.EqualTo(func)); 
} 

[Test] 
public void Will_Fail() 
{ 
    Func<string> funcA =() => "key"; 
    Func<string> funcB =() => "key"; 
    Assert.That(funcA, Is.EqualTo(funcB)); 
} 

我需要測試 - 成功斷言 - 一個Func的一個實例是等於另一個實例。所以我基本上需要一種方法來使失敗的測試通過。

有沒有辦法做到這一點,而無需創建自定義類型並覆蓋Equals()

+0

也許用表達式樹而不是'Func '這可能會更容易。 – Oded

+1

請參閱[ExpressionEqualityComparer.cs](https://source.db4o.com/db4o/trunk/db4o.net/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/) –

+0

@ L.B謝謝;表達式方法具有價值,但我將按照John的建議測試輸出。 – Nick

回答

5

您的失敗測試不應該通過。就.NET中的任何事情而言,它們都不是同等功能 - 至少在目前的Microsoft C#編譯器實現方面。代表將參考單獨生成的方法(通過查看IL很容易驗證)。語言規範允許它們是平等的,但不要求它,並且我不知道有任何實現會這樣做。

爲代表的相等性比較基本上由(對於單動作代表):

  • 執行代表指的是相同的方法?
  • 如果代表有目標,這些目標是否相等?

第一個條件在您的測試中將是錯誤的。

+0

所以通過聲明兩次函數,爲每個不同的東西生成一個方法(可能唯一命名?)。我可以通過在失敗的測試中初始化一個新的'func'來證明這一點,然後將'func'分配給'funcA'和'funcB'。測試然後通過。問題的原因是我有一些硬編碼的inline'func'需要驗證。您是否會建議我將這些「func」全局訪問以便對他們作出斷言? – Nick

+0

@Nick:我會測試這些函數的用法是否正確,而不是測試使用完全相同的函數。 –