2011-04-20 83 views
1

假設我有很多類,比如這個(Foo1和Foo2 ..)正確的方法來測試轉換,類似的方法

class Foo 
{ 
    public int F{get; set;} 

    public Bar ConvertToBar() 
    { 
     return new Bar(){ B = this.F*10 }; 
    } 
} 

所有他們所共有的是ConvertToBar()方法。

我有兩種方法來進行單元測試這種方法:)

  1. 呼叫轉換爲ConvertToBar(並檢查它的所有屬性(我必須這樣做,爲每個美孚像類中的所有測試)

    Bar bar = foo.ConvertToBar(); Assert.AreEqual(expectedValue,bar.Property);比較兩個酒吧實例,然後 ...

  2. 寫輔助方法,使用這樣的:

    酒吧expectedBar =新的酒吧() Assert.True(barCompareMethod(expectedBar,foo.ConvertToBar()) ;?

會是怎樣編寫單元測試這種方法的最佳途徑

+0

相關:http://stackoverflow.com/questions/2046121/how-to-compare-two-object-in-unit-test-how-to-compare-two-collection-in-unit-tes – 2011-04-20 14:09:59

回答

4

是否有意義的Bar自己是IEquatable<Bar>如果是的話,我會在你的生產代碼中實現,而不是使用輔助方法。然後你可以使用Assert.AreEqual(expectedBar, actualBar)

+0

假設Bar的代碼無法更改 – 2011-04-20 14:07:51

+0

而且,如果在測試轉換的所有類主題中實現「IEquatable 」的努力是否合理,您會如何看待?這將是一場噩夢! – 2011-04-20 14:08:20

+0

+1我總是去IEquatable自己,但看到我的答案是如何處理不適當或不可能的情況。 – 2011-04-20 14:09:03

3

我不確定是否有最佳方法。

  • 第一個在我看來更具可讀性。您可能需要試驗NUnit's property constaints

    Assert.That(someObject,Has.Property(「Version」)。EqualTo(「2.0」));

  • 第二個是更多的工作,你必須在Bar類中定義Equals(如果你沒有源編輯訪問權限,可能會出現問題)。但如果需要大量的屬性,則會更好。

+0

我個人認爲,爲了執行簡單相等測試,屬性約束比簡單的Assert.AreEqual測試更不可讀。我知道有些人喜歡它,但我不是我自己的粉絲... – 2011-04-20 14:14:42

+0

@Jon - 真的。我回答了問題中的例子。如果一個對象有n個屬性,其中在當前測試的上下文中只有1個或2個屬性相關,我更喜歡約束或匹配器,因爲它們傾向於突出顯示更改。如果大多數屬性是相關的,那麼我同意平等方法方法贏得..我正在試驗Hamcrest匹配器截至目前..所以可能會發布的影響:) – Gishu 2011-04-20 15:26:58

+0

我的意思是一個簡單的'斷言。 AreEqual(「2.0」,someObject.Version)'而不是使用'Has.Property'語法。我從來沒有像哈姆雷斯特的粉絲;) – 2011-04-20 15:31:16

4

由於喬恩斯基特表明,在酒吧實現自定義的平等是一個偉大的想法,只要你懂得如何避開Equality Pollution

語義比較,你可以使用AutoFixture的SemanticComparison庫,這將使你寫這樣的斷言:

var expected = bar1.AsSource().OfLikeness<Bar>(); 
expected.ShouldEqual(bar2); 

的ShouldEqual方法是一個自定義的斷言,將每個屬性比較(通過匹配名稱),只有在所有屬性相同時纔會成功;否則它會拋出一個描述性的異常。

+1

我不是問題的作者,但我真的相信這是正確的解決方案。 – 2011-04-20 14:09:48