2013-10-25 120 views
1

我正在嘗試使用單元測試最佳實踐,並且遇到了一個問題,我無法得到我的頭。產品代碼有一個轉換給定的對象到另一個,像這樣一個功能:NUnit如何防止代碼重複

原來的對象:

public OriginalObject 
{ 
    public string Id {get; set;} 
    public string Value {get; set;} 
    public int FormCode {get; set;} 
    public int NameCode {get; set;} 
    //other properties 
} 

public TransformedObject 
{ 
    public string Value {get; set;} 
    public int FormCode {get; set;} 
    //other properties 
} 

變換功能:

public TransformedObject Transform(OriginalObject originalObject) 
{ 
    var TransformedObject = new TransformedObject(); 
    TransformedObject.Value = originalObject.Value; 
    TransformedObject.FormCode = originalObject.FormCode; 
    return TransformedObject; 
} 

而且測試看起來是這樣的:

[Test] 
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame() 
{ 
    OptionObjectTransform transform = InitTransform(); 
    CustomOptionObject result = transform.Transform(optionObject);//mock optionObject 
    Assert.AreEqual(optionObject.Value, result.Value); 
} 

所以我的問題是,我必須寫每個屬性的測試?或者有沒有辦法使用[TestCase]來傳遞我想測試的屬性?或者應該測試檢查,看看所有的屬性是否相等? 我不認爲最後一個是解決方案,因爲如果測試失敗,我們不知道哪個屬性不匹配。

回答

0

NUnit(以及所有其他xUnit框架)的限制是它們在第一個斷言失敗時失敗並且不運行其他斷言。正如你所說,這意味着如果試圖通過許多斷言來測試許多值,則無法檢測到多個失敗。然而,正如你也指出的那樣,許多重複的測試,每個測試一個不同的值都不是很理想,因爲它涉及很多重複的代碼,只是爲了解決NUnit的限制。

「兩全其美」解決方案是測試對象數組是否相等。這可能採取以下形式:

[Test] 
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame() 
{ 
    OptionObjectTransform transform = InitTransform(); 
    CustomOptionObject result = transform.Transform(optionObject); 
    var expected = new[] { optionObject.Value, optionObject.FormCode }; 
    var actual = new[] { result.Value, result.FormCode }; 
    Assert.AreEqual(expected, actual); 
} 

這樣,您可以用一個測試測試很多值,並且可以同時知道許多故障。

+0

當經歷的測試,如果測試失敗,那麼就不會真的是確切地知道哪個屬性沒辦法,我們只知道其中一人做,對嗎? – SOfanatic

+0

比較可能會報告如下內容:預期{「a」,1},但得到{「b」,2}。因此,您可以看到每個沒有捕捉的屬性,而不僅僅是第一個屬性。 –

0

對於簡單的映射(即只有少量計算映射或「如果」),我使用SharpTestEx,其中有一個nice Satisfy assertion,它報告所有錯誤的斷言。

的代碼是這樣的:

mapped.Satisfy(m => 
    m.Prop1 == source.SomeData + "zz" && 
    m.Prop2 == source.Prop2 ... 
);