2013-09-27 23 views
0

給定一個具有多個屬性的對象,例如System.Drawing.Rectangle,我想聲明所有屬性的值(當ONE屬性不匹配時不會停止)並報告所有屬性。如何在nunit中原子性地測試屬性

我嘗試這個代碼,希望它會做什麼,我想......

System.Drawing.Rectangle croppingRectangle = SomeMethodReturnsRectangle(testP1,testP2); 
Assert.That(()=>{ croppingRectangle.X==testX && croppingRectangle.Y==testY },"expected X={0}, Y={1} but was X={2},Y={3}", testX,testY,croppingRectangle.X,croppingRectangle.Y); 

什麼在NUnit的正確的方式做到這一點?

(我知道這工作:)

if(croppingRectangle.X==testX && croppingRectangle.Y==testY) { 
    Assert.Pass(); 
else 
    Assert.Fail("expected X={0}, Y={1} but was X={2},Y={3}", testX,testY,croppingRectangle.X,croppingRectangle.Y); 

回答

1

我假設你要打類型本身檢查平等和覆蓋ToString?因爲那樣做會很好。

一種選擇是使用匿名類型來實現相同的目標:

Assert.AreEqual(new { X = testX, Y = testY }, 
       new { croppingRectangle.X, croppingRectangle.Y }); 

由於方式匿名類型的工作(與EqualsToString被自動生成),這應該給你一個很好的錯誤消息同時檢查所有屬性。它確實依賴每個屬性相等性檢查作爲每個屬性類型的默認檢查。

+0

由於我(技術上)無法更改核心庫,因此我必須檢查自己。有趣的新的匿名類型的方法,我會嘗試並報告回來。 – enorl76

+0

回報:所以這個效果很好......匿名類型像你說的那樣生成Equals ...但是看起來有點麻煩。 – enorl76

+1

@ enorl76:對我來說,看起來不像你希望工作的代碼那麼麻煩。如果您需要爲某種特定類型定期執行此操作,則可以在該類型上創建一個「ToAnonymousType」擴展方法。 –

0

如果您的矩形是某種類型的值對象,則可以依靠.Equals方法一次比較整個對象。

或者,您可以將錯誤追加到列表中。

var errors = new List<String>() 

if(croppingRectangle.Prop == ExpectedValue) { 
    //test 
} 
else {errors.add("ErrorMessage");} 

.... and so on 

Assert.IsEqual(errors.Count, 0); 
+0

我試圖避免長時間if/else語句 – enorl76