Assert.AreEqual - Null 与空字符串

dre*_*w_w 6 c# nunit

以下面的例子为例:

string x = null;
var y = String.Empty;
Assert.AreEqual(x, y);             // test fails!
Assert.AreEqual(x ?? "", y ?? ""); // passes, but ugly!
Run Code Online (Sandbox Code Playgroud)

我知道空字符串和空字符串不一样,但对于我的特定应用程序,它们基本相同。我的问题是 - 是否有任何快捷方式可以以相同的方式处理空字符串和空字符串?否则我将面临使用空合并运算符的问题(有点难看!)

背景

对于这个问题来自哪里的背景,我正在为一个项目编写集成测试。基本上我将值保存到数据库中,然后再次加载它们并检查两者是否匹配。某些值在保存时为空字符串,但通过 EF 加载时,它们将作为空值返回。这会导致我的许多集成测试失败。

编辑/注意- 我用于测试的值是随机的。这意味着有时该值将是空的,但有时它们会被填充。请记住,我必须在每个字符串比较中使用 null 合并(因此是执行此操作的缩写方式的问题)。

Gre*_*mer 4

Drew:AlexD 已经步入正轨,尽管他还没有完全找到答案。例子:

    static void Main(string[] args)
    {
        Console.WriteLine(AreSame("", ""));
        Console.WriteLine(AreSame("", null));
        Console.WriteLine(AreSame(null, ""));
        Console.WriteLine(AreSame(null, null));

        Console.Read();
    }

    private static bool AreSame(string x, string y)
    {
        return (string.IsNullOrEmpty(x) == string.IsNullOrEmpty(y));
    }
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你可以使用

Assert.AreEqual(string.IsNullOrEmpty(x), string.IsNullOrEmpty(y));
Run Code Online (Sandbox Code Playgroud)

或者

Assert.IsTrue(AreSame(x, y));
Run Code Online (Sandbox Code Playgroud)

丑陋的?当然可以,但你至少可以稍微抽象一下丑陋之处。丑如

Assert.AreEqual(x ?? "", y ?? ""); // passes, but ugly!
Run Code Online (Sandbox Code Playgroud)

??? 没有把握。取决于你如何看待它。

  • 但 x 和 y *也可以*也有值。也许比较是 `string.IsNullOrEmpty(x) == string.IsNullOrEmpty(y) || x == y`? (6认同)