2016-04-07 48 views
7

我正在重寫一些單元測試,以使用NUnit 3而不是NUnit 2,並且需要將某些斷言更改爲基於約束的斷言。我有以下斷言:使用基於約束的斷言提高可讀性以斷言IsNotNullOrEmpty

Assert.IsNullOrEmpty(result); 

,我已經改爲:

Assert.That(result, Is.Null.Or.Empty); 

不過,我斷言IsNotNullOrEmpty的時候我並不完全滿意,可讀性:

Assert.That(result, Is.Not.Null.And.Not.Empty); 

我目前的建議是創建以下靜態類:

public static class Text 
{ 
    public static EmptyConstraint IsNullOrEmpty => Is.Null.Or.Empty; 

    public static EmptyConstraint IsNotNullOrEmpty => Is.Not.Null.And.Not.Empty; 
} 

用法:

Assert.That(result, Text.IsNotNullOrEmpty); 

這在引入定製約束爲代價提供更好的可讀性。有沒有一個標準的方式來作出相同的斷言,或者我應該繼續使用Is.Not.Null.And.Not.Empty而不是?

+0

這個問題可以客觀地回答。編輯主體以非主觀的方式重申問題;投票重新開放。 – dasblinkenlight

回答

7

如果沒有Test類,您斷言Is.Null.Or.Empty的讀數完全正常。此外,當這個斷言失敗時,你確切地知道發生了什麼:你有一個有效的string對象不是空的。

我在「DeMorganizedized」版本的否定中看到的問題,即Is.Not.Null.And.Not.Empty,它太長了,它看起來不像Is.Null.Or.Empty那麼好。

然而,而不是讓一個單獨的約束它,我會單獨斷言它的部分,即

Assert.That(result, Is.Not.Null); 
Assert.That(result, Is.Not.Empty); 

我之所以會做這樣的是,這兩個故障條件不重疊,即result可能是null,或者它可能是空的,但它不能同時出現。一個複合斷言不能區分這兩種情況,所以最終你需要調試器來查看result是否爲null或爲空。

另一方面,單獨的斷言告訴你到底發生了什麼,同時保持非常可讀。他們每個斷言「花費」一個額外的行;我認爲這是獲取有關潛在故障的更準確信息的合理成本。