2010-06-17 82 views
7

看起來格外嚴格,但規則任何公開可用的應該測試應該測試auto-implemented properties單元測試自動執行的屬性是否有價值

Customer類

public class Customer 
{ 
    public string EmailAddr { get; set; } 
} 

通過

[TestClass] 
public class CustomerTests : TestClassBase 
{ 
    [TestMethod] 
    public void CanSetCustomerEmailAddress() 
    { 
     //Arrange 
     Customer customer = new Customer(); 

     //Act 
     customer.EmailAddr = "[email protected]"; 

     //Assert 
     Assert.AreEqual("[email protected]", customer.EmailAddr); 
    } 
} 

回答

7

如果從自動實現的屬性切換到完全不同的東西,會發生什麼?該測試似乎只是多餘的,因爲你知道實現 - 在編寫測試時你不應該考慮這一點。

當然,這取決於你實際上很快改變實施的可能性。

+4

但是,如果發生這種情況,你可以通過先寫測試來做到這一點嗎?那麼它會被測試。至少如果你做TDD,這將是它的工作方式。我們都知道人們並不總是先寫測試。 – ckramer 2010-06-17 21:16:36

+1

+1爲迴歸方面。這是今天的汽車財產,但明天它可能需要修改以支持新的類功能等。 – 2010-06-18 02:40:29

1

這取決於你要測試的是一個API符合預期的屬性集的測試,或者如果你表現出,你只是測試訪問和設置屬性。

在你給的例子中,我會說不。

更新

符合預期API;如果您間接訪問屬性,請在反射/動態環境中說,並且您使用屬性和方法訪問調用來驗證未知的API是否符合預期的API。

+0

您可以詳細說明「測試API是否符合預期屬性集合」的意思嗎? – ahsteele 2010-06-17 21:12:22

10

我通常認爲任何不執行動作的代碼都不值得測試。這通常意味着我不測試屬性(自動實現或不),因爲它們只是設置或返回一個值。

如果屬性的getter或setter執行某種「工作」,比如可能根據某些其他字段/屬性/任何其他狀態返回兩個(或更多)值中的一個,則這會改變。

如果你還沒有看到它,我強烈推薦Roy Osherove'sbook on Unit Testing。它涉及各種「什麼時候測試什麼時候」類型的問題,包括這個問題。

+1

測試自動屬性測試框架,而不是您的代碼:沒有代碼邏輯來驗證。如果你最終在屬性後面添加代碼,你應該看到測試覆蓋率下降,這將表明現在是測試該屬性的時候了。 – Mathias 2010-06-18 22:38:02

+0

它比看到測試覆蓋率下降更簡單...正如我在其他響應中評論的那樣,如果您更改代碼以使其不是自動屬性,那麼該更改應該由測試驅動,因此您將在那個時候測試功能的變化。 – ckramer 2010-06-18 22:51:19

0

單元測試應該僅限於您在應用程序中實現的測試功能。

您不應該測試應用程序依賴的API/SDK。部分原因是浪費時間(貴公司是否想支付測試X-Third-Party的SDK/API的費用),部分原因是它將「噪聲」引入到單元測試套件中。單元測試庫的上下文應該只是測試應用程序中的代碼。

+0

'客戶'是我們擁有的一類。 – ahsteele 2010-06-17 21:16:47

+0

@ahsteele,true,但是您的測試可以說只是測試C#編譯器的行爲。 – Yishai 2010-06-17 21:25:31

+0

@易海同意了,在重讀這個答案時,我看到了戰士們在駕駛什麼。 – ahsteele 2010-06-17 21:33:52

1

測試設置和獲取屬性應該在測試對象的業務功能的上下文中發生。如果沒有業務功能測試該屬性,那麼您不需要該屬性或者需要更多測試。我建議你在添加需要它們的測試時添加屬性,而不是在編寫任何測試之前添加它們。

通過測試業務功能,您將從單元測試的角度看待更多的黑匣子。這使您可以在下面切換實施細節,對測試影響更小。由於重構是TDD循環中一個重要的(並且經常被忽略的)階段,這意味着很少的代碼編輯。你也許會意識到(例如)該屬性不應該有公共setter,應該由執行驗證和其他業務邏輯的方法來分配。

相關問題