2017-07-15 118 views
0

我在我的項目中有一個申請表,我想寫單元測試。 我的代碼背後有必要的字段進行服務器端驗證,以確保該字段不是空白。我需要幫助才能知道我是否寫過這篇文章,因爲這只是我編寫單元測試的第二天。請漂亮的我只有13單元測試在c#中的必填字段

[Required(ErrorMessage = "Please provide a title")]   
public string Title 
{ 
    get; set; 
} 
在我的單元測試我做

public void TitleIsNotBlank() 
{ 
    Assert.IsNotNullOrEmpty(_vm.Title); 
} 

這會檢查字段不爲空

呢?

+1

它的確會。雖然記住它不介意'[Required(ErrorMessage =「請提供標題」)]屬性,單元測試只是直接測試字段本身。我也不認爲有一個保證,即一個空字符串會在該屬性和'IsNotNullOrEmpty'斷言之間表現出相同的行爲。 (儘管它巧合的可能有相同的行爲。)因此,它可能是值得明確地測試該邊緣案例。 – David

+0

我只理解了一半。你說它只會測試該字段不是空的或空的,但它不會測試返回的錯誤消息是那個錯誤消息。如果是這樣,我明白了。謝謝 – user2903379

+0

這是一個正確的理解,是的。您不應該*需要*測試屬性的行爲,因爲這是一個框架組件,並且通常由供應商進行測試。取決於你可能不相信框架。在100%的覆蓋率單元測試是一個值得追求的目標,但在任何複雜的系統總是有(1)什麼是「100%」的意思,(2)在測試一些部件收益遞減的爭論。 (這意味着測試某些代碼的價值並不總是超過開發測試的成本,有時候。) – David

回答

0

重要的是要明白,[Required]屬性只裝飾屬性,但它不會自動驗證它,除非有某些事情調用它的功能。

通過裝飾屬性,您告訴任何其他進程可能會檢查它應該被要求以及錯誤消息應該讀取的內容。例如,MVC框架的驗證會爲您在此屬性中啓用驗證。這是驗證實際發生的時間。

在我看來,這最好應在業務對象級別測試(當你真正分配模型對象的價值,並嘗試用它做什麼,就像保存)。

假設是該屬性的驗證代碼已經過測試,所以您不需要。但是,因爲你的目標是增加覆蓋,你可以做的是測試,以確保所要求的檢查,並確保它被裝飾成這樣的字段被「標記」:

var type = typeof(YourModelClass); 
var property = type.GetProperty("Title"); 
var attributes = (Required[])property.GetCustomAttributes(typeof(Required), false); 
Assert.IsTrue(attributes.Length > 0);