2012-01-13 31 views
3

有沒有更簡單或更醜陋的方式來調用。載有()在一個字符串,它可能爲null然後通過執行:有沒有更簡單的方法來調用可能爲空的字符串上的Contains()?

Assert.IsTrue((firstRow.Text ?? "").Contains("SomeText")); 
+1

我認爲答案是 - 不,可以使用'.IsNullOrEmpty'來減少醜陋' – V4Vendetta 2012-01-13 06:06:19

+0

這已經<10個字符了。簡單多少? – Jon 2012-01-13 06:08:03

+0

當我讀這行代碼時,我必須進行小心的編譯和執行,以確保它的行爲與我認爲的一致。當然,這個例子很簡單,但沿着這條路走向更復雜的代碼行。另請注意,Assert類通常也會有一個[IsNotNull方法](http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.assert.isnotnull(v = VS.80) .aspx),在這裏可以用作前面的語句。通過將這兩個條件集合在一起,您的單元測試在識別錯誤​​原因方面效率較低。 – 2012-01-13 19:16:15

回答

2

這是一個字符短,但坦白說,我喜歡你原來的代碼更好。

Assert.IsTrue((firstRow.Text + "").Contains("SomeText")); 
+1

哈哈,那是很好的工作:) – nawfal 2012-01-13 06:44:28

+1

@nawfal - 現在我必須upvote所有非平凡的答案出有罪:) – 2012-01-13 06:47:01

+0

哈哈,來吧它沒關係。我不喜歡簡單的文本!= null &&這些日子裏有一些更清晰的語法,我喜歡你的不同想法:) – nawfal 2012-01-13 06:52:18

5

我認爲這些替代品是更好的,即使他們是不是很短:

// 1 
Assert.IsTrue(firstRow.Text != null && firstRow.Text.Contains("SomeText")); 

// 2 
Assert.IsNotNull(firstRow.Text); 
Assert.IsTrue(firstRow.Text.Contains("SomeText")); 

// 3 
var text = firstRow.Text; 
Assert.IsTrue(text != null && text.Contains("SomeText")); 

我認爲「簡單」是一個主觀的術語。對我而言,簡單的意思是「清晰易讀」,而不是「最少數量的字符」。

考慮到此代碼似乎是單元測試的一部分,選項#2將是最好的,因爲那麼您可以通過閱讀測試結果來判斷測試是否由於空值而失敗或者因爲值沒有包含預期的文字。否則,您將不得不使用調試器重新執行此測試,並在運行時查看該值以區分這兩種情況。 「讓事情儘可能簡單,但並不簡單」。 - 愛因斯坦

+1

不應該是&&運營商,而不是|| ? – KingNestor 2012-01-13 06:09:59

+1

@KingNestor - 是的!我不得不考慮一分鐘的原始代碼並解決這個問題。我認爲這說明了爲什麼原始代碼不清楚。 – 2012-01-13 06:19:02

+0

選項1和2更好。選項3不是我會使用的一種選擇。 _Assert_的用途是在調試時引發錯誤,編譯器將在關閉DEBUG標誌的情況下進行編譯時將其轉換爲C#等價的NOP。但_var text_聲明瞭一個變量,不管它是否被添加到堆棧中(儘管編譯器可能足夠聰明以使其樂觀)。 – 2012-01-13 18:52:12

0

我覺得一個普通的不行,

這將是一個少一點醜陋和獲取隱含可讀性

If(!string.IsNullOrEmpty(firstRow.Text)) 
    Assert.IsTrue(firstRow.Text.Contains("SomeText")); 
+0

看起來像你錯過了!在if條件下。 – 2012-01-13 06:20:32

+0

@ Dr.Wily'sApprentice對不起,感謝您發現它,可怕的錯誤 – V4Vendetta 2012-01-13 06:23:18

+0

「可怕」不是我如何描述它。 :)我在自己的答案中出現了一些錯誤。 – 2012-01-13 06:25:35

2

沒有,根本就沒有什麼。但是,你可以寫一個擴展方法爲:

public static bool SContains(this string source, string query) 
{ 
    return source != null && source.Contains(query); 
} 
+0

擴展方法必須是靜態的。只是一個律'提醒.. – nawfal 2012-01-13 06:52:59

0

我一般會使用的東西更像是長少聰明,但地道的C#和意圖是顯而易見的下面。

Assert.IsTrue(!string.IsNullOrWhiteSpace(firstRow.Text)) 
Assert.IsTrue(firstRow.Text.Contains("SomeText")); 

在我對這個問題的解釋中,空字符串是一個錯誤條件。這是我更喜歡我的版本的原因之一 - 測試的上下文是明確的。如果我想包括空字符串作爲一個有效的結果,我會用以下內容作爲第一條件,再次做試驗明確:

Assert.IsNotNull(firstRow.Text) 

對我來說,這是比縮短了代碼更爲重要。在我(或其他人)回來修改代碼的一個月內,顯然測試的目的是什麼。在原來的問題中,並非如此。

+0

這wouldnt工作時firstRow.Text =「」和「SomeText」=「」。 – nawfal 2012-01-13 13:11:08

+0

@nawfal - 是「」SomeText「的有效值嗎?假設它不是一個有效的值,我認爲這是不做原始代碼的原因。邊緣案例可能會導致意外行爲。 – 2012-01-13 20:06:15

+1

@myself - 呃......讓我想想我說的一分鐘。我不確定我是否同意我自己的觀點...... – 2012-01-13 20:12:44

0

我期望字符串是空暴露了不同的錯誤字符串不是「SomeText 「,在這種情況下,最好有兩個單元測試來測試不同的結果。

在方法方面,使用StringAssert和IsNotNull怎麼樣?

Assert.IsNotNull(firstRow.Text); 

StringAssert.Contains(firstRow.Text, "SomeText"); 

(我假設這涉及到一個單元測試)

1

我建議使用Assert.That語法:如果您需要檢查文本不包含特定字符串

Assert.That(firstRow.Text, Does.Contain("SomeText")); 

Assert.That(firstRow.Text, Does.Not.Contain("SomeText")); 
相關問題