2010-07-07 82 views
4

這是我有點擔心的一堂課。我的目標是單元測試地址列表:單元測試時使用反射或屬性?

public class LabelPrinter 
{ 
    private readonly IEnumerable<Address> _addresses; 

    public LabelPrinter(IEnumerable<Address> addresses) 
    { 
     _addresses = addresses; 
    } 

    public Document Create() 
    { 
     // ... Generate PDF, etc ... 
    } 
} 

那麼,什麼是最好的:

  1. 使用反射來檢查私有財產,或
  2. 由於原來的IEnumerable可以從外部反正修改,做一個公共getter並且測試它?

回答

0

特別是在學習單元測試時,通過簡單的測試和更好的覆蓋率,讓關於保持領域私密性的擔憂被超越。選項2.

7

一般來說,私人成員不應該進行單元測試,因爲任何類使用它的私人成員應該以某種方式反映在對象的外部可測試行爲中。換句話說,只要外部行爲是應該的,誰在乎那裏發生了什麼。

單元測試私人成員還會將您的測試耦合到一個類的內部,使它們變得更脆弱。如果您以後決定使用更高效的集合,即使對象的行爲沒有改變,您的測試也會中斷。您特別希望避免反射,因爲按名稱查找屬性意味着如果屬性名稱發生更改,則測試會中斷。

換句話說 - 如果您需要測試Address類,請從自己的單元測試中進行測試,而不是從LabelPrinter的測試中進行。如果您必須使用兩種方法中的一種,請使用第二種方法,而不是反射。

+0

該地址只是一個數據容器。我想測試的是IEnumerable的長度,例如,不暴露給外部。 – ciscoheat 2010-07-08 12:27:40

+1

@ciscoheat - 通過測試IEnumerable的長度,你會獲得什麼?你不需要爲.NET的賦值語句編寫單元測試。 ('_addresses = addresses')。 – 2010-07-08 14:43:43

+0

我想知道查詢是否返回了正確的地址列表,例如。 – ciscoheat 2010-07-08 21:37:58

1

你想在這裏測試addresses列表?在上面提供的示例代碼中,實際上很容易,因爲您可以通過構造函數注入列表。因此,在您的測試,你可以訪問列表本身,因此並不一定需要再次揭露它:

[Test] 
public void Test() 
{ 
    IEnumerable<Address> addresses = new List<Address>(); 
    LabelPrinter printer = new LabelPrinter(addresses); 

    ... // execute your test here 

    Assert.AreEqual(blah, addresses.get(0)); 
    // or any other assertion you want to make on the addresses list 
    // created up above. 
} 
0

測試Create,而不是制定者(這是有效的,你有什麼在這裏)。我發現測試setter/getters是有點浪費時間。 ESP。因爲大多數情況下,制定者必須執行一些其他測試才能工作。它們大部分也太簡單而不會失敗。

因此,而不是驗證LabelPrinter_addresses,它是Y,檢查輸出Create包括相關的詳細信息。