有没有一种更简单的方法可以对可能为null的字符串调用Contains()

本文关键字:字符串 Contains 调用 null 方法 一种 更简单 有没有 | 更新日期: 2023-09-27 18:20:22

有没有一种更简单或不那么难看的方法可以对可能为null的字符串调用.Contains(),然后执行:

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

有没有一种更简单的方法可以对可能为null的字符串调用Contains()

我建议使用Assert.That语法:

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

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

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

我认为这些替代方案中的任何一个都更好,尽管它们没有那么短:

// 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"));

我认为"简单"是一个主观的术语。对我来说,Simple的意思是"清晰易读",而不是"最少的字符数"。

考虑到这段代码似乎是单元测试的一部分,选项#2将是最好的,因为这样你就可以通过阅读测试结果来判断测试是由于null值而失败,还是因为该值不包含预期的文本而失败。否则,您将不得不使用调试器重新执行此测试,并在运行时查看该值,以便区分这两种情况。

"让事情尽可能简单,但不要更简单。"-阿尔伯特·爱因斯坦

这只短了一个字符,但坦率地说,我更喜欢您的原始代码。

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

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

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

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

在方法方面,使用StringAssert和IsNotNull怎么样?

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

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

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

StringAssert类可用于轻松断言字符串UnderTest是否包含指定的字符串

我认为一个简单的不,

这会稍微不那么难看,并获得隐含的可读性

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

我通常会使用更像下面这样的东西,它更长,不那么聪明,但惯用c#,其意图是显而易见的。

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

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

Assert.IsNotNull(firstRow.Text)

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