【问题标题】:Assert.AreEqual - Null vs Empty StringAssert.AreEqual - Null 与空字符串
【发布时间】:2014-09-22 08:32:17
【问题描述】:

举个例子:

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

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

背景

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

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

【问题讨论】:

  • @reggaeguitar 如果您阅读了我不是在询问字符串比较的问题。我在问如何缩写 nUnit 调用。
  • 你是对的,我很抱歉。我只会创建一个包含空合并运算符的方法并在您的 Asserts 中调用它
  • 我不确定 nunit 是否支持IEqualityComparer,如果支持,您可以通过自定义比较器。否则创建自定义比较器并像 Assert.IsTrue(yourComparer.Equals(x,y)) 一样使用它
  • 以 X 和 Y 作为参数并封装断言的扩展方法怎么样?
  • Assert.AreEqual(x + "", y + ""); 会少两个字节丑:)。

标签: c# nunit


【解决方案1】:

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));
    }

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

Assert.AreEqual(string.IsNullOrEmpty(x), string.IsNullOrEmpty(y));

或者

Assert.IsTrue(AreSame(x, y));

丑吗?当然可以,但是您至少可以将丑陋抽象一下。丑得像

Assert.AreEqual(x ?? "", y ?? ""); // passes, but ugly!

???不确定。看你怎么看。

【讨论】:

  • 但是 x 和 y 可以 也有值。也许比较会是string.IsNullOrEmpty(x) == string.IsNullOrEmpty(y) || x == y?
猜你喜欢
  • 2017-03-31
  • 2022-10-22
  • 2012-07-18
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多