有没有更简单的方法在可能为null的字符串上调用Contains()?

时间:2012-01-13 06:04:44

标签: c#

是否有更简单或更简单的方法来调用.Contains()在一个字符串上,该字符串可能为null,然后执行:

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

8 个答案:

答案 0 :(得分:6)

我认为这些替代品中的任何一种都更好,即使它们不是那么短:

// 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 :(得分:6)

我建议使用Assert.That语法:

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

如果您需要检查文本是否包含某个字符串:

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

答案 2 :(得分:3)

这是一个较短的字符,但坦率地说,我更喜欢你的原始代码。

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

答案 3 :(得分:2)

不,没有。但你可以为此写一个扩展方法:

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

答案 4 :(得分:1)

根据http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.stringassert(v=vs.100).aspx

StringAssert类可用于轻松断言stringUnderTest是否包含specefied字符串

答案 5 :(得分:0)

我认为一个简单的否,

这会有点不那么难看,并且具有隐含的可读性

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

答案 6 :(得分:0)

我通常会使用更像下面的东西,这些东西更长,更不聪明但是惯用的c#并且意图很明显。

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

在我对问题的解释中,空字符串是一个错误条件。这是我更喜欢我的版本的一个原因 - 测试的上下文是明确的。如果我想将空字符串包含为有效结果,我将使用以下作为第一个条件,再次使测试显式:

Assert.IsNotNull(firstRow.Text)

对我而言,这比缩短代码要重要得多。在我(或其他人)回来对代码进行更改的一个月中,显然测试的目的是什么。在最初的问题中,没有那么多。

答案 7 :(得分:0)

我希望字符串为null会给不是" SomeText"的字符串带来不同的错误,在这种情况下,最好有两个单元测试来测试不同的结果。

在方法方面如何使用StringAssert和IsNotNull?

Assert.IsNotNull(firstRow.Text);

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

(我假设这与单元测试有关)