2014-09-04 56 views
1

假設我有一個具有3個字段/屬性的類。假設我所有的單元測試現在都在我的項目中使用這個類。 如果我添加一個新的屬性到這個類(第四個字段),那麼我想要一個單元測試失敗。我將如何編寫這樣的可以檢測屬性添加的單元測試?在C中檢測新字段/屬性的單元測試#

+3

我在想思考..但你爲什麼要這樣做? – anthonybell 2014-09-04 14:48:23

+0

@anthonybell我猜想這是一種序列化,但是,知道動機很重要。 – Matthew 2014-09-04 14:49:08

+1

請參閱http://stackoverflow.com/questions/737151/how-to-get-the-list-of-properties-of-a-class以獲取所有屬性的列表,然後將其與已保存的屬性列表進行比較名稱和斷言,如果有變化? – dbc 2014-09-04 14:53:09

回答

4

這是一個使用反射的例子。

void TheUnitTest() 
{ 
    var p = new Person(); 
    Assert.That(p.GetType().GetProperties().Count() == 3); 
} 

public class Person { public String Name{ get; set; } public int age { get; set; } public String job { get; set; } } 
+1

。 – Lee 2014-09-04 15:02:32

+0

這是我的問題的最佳解決方案。因爲我只需要指出該字段已更改。我不需要跟蹤所有的字段名稱。通過看到這個失敗,我可以採取行動來覆蓋我的單元測試中新添加的字段。很多時候,開發人員無法將單元測試添加到新添加的字段中。 – 2014-09-04 15:03:10

+2

@BlueClouds你爲什麼要測試字段?字段是實現,而不是功能。您測試行爲,而不是執行。 – 2014-09-04 15:08:59

0

我不完全確定你爲什麼想要這樣做,但這裏有一些建議。

您可以使用FluentAssertions庫來執行Assertions on types, methods, and properties。您可以枚舉該對象的屬性並聲明每個屬性的名稱都在已知屬性的列表中。

如果你試圖測試的是,你已經從映射到DTO對象的業務對象獲得所有屬性(這幾乎是我能想到做這種事情的唯一原因),那麼考慮使用AutoMapper而不是滾動你自己的代碼 - 它有一個method for testing that there are matching properties between two objects

+0

謝謝,但這不是原因。你對我給出的理由有什麼看法(回覆@anthonybell) – 2014-09-04 15:07:30

+0

我認爲對每個屬性進行測試通常是不必要的,你可能想要的是在你的構建過程中進行某種測試覆蓋檢查,以提醒你當你得到的數量少於預期的覆蓋範圍時。 (http://www.jetbrains.com/dotcover/features/) – 2014-09-04 15:30:08

+0

此外,我同意丹尼爾曼在他的回答中的評論。我認爲你可能在TDD的方向上走錯了道路,並增加了額外的成本,以獲得非常低的回報。 – 2014-09-04 15:31:49

3

你不想這樣做。單元測試的重點是驗證功能,而不是實現。您不需要在類上添加屬性,只需添加它以獲得樂趣 - 您可以將其添加爲實現某個新功能的一部分,然後測試該功能。

如果您添加一個屬性並且它對應用程序沒有任何功能差異,那很好。你不需要測試它,它不會改變你的代碼庫的功能。您將通過功能測試來測試屬性。

+0

同意你的意見。這是一個問題,開發人員爲課程添加了一個新的字段(帶有功能),並忘記寫一個單元測試來檢查它。你將如何找到它?忽略它可以嗎? – 2014-09-04 15:11:48

+1

該字段將通過在該字段周圍建立的行爲測試進行測試。測試一個「領域」是沒有意義的。什麼是測試完成?如果getter或setter中有邏輯,測試屬性*可能有意義,儘管get/set方法中的代碼仍將通過對使用該屬性的代碼的測試來執行。 – 2014-09-04 15:16:57

+0

對不起,我似乎沒有理解我的觀點,我休息我的情況。但作爲最後一次嘗試:你所談論的測試不包括新增的領域。因爲它們是在添加新字段之前編寫的。添加新字段(通過更改請求)的開發人員僅執行了代碼(沒有單元測試)。開發者只是沒有時間或完全忘記單元測試。日子繼續......新添加的字段從未成爲單元測試的一部分,即使它們具有重要功能 – 2014-09-04 15:22:06