【问题标题】:Testing string value of Nothing is equivalent to String.Empty测试 Nothing 的字符串值等价于 String.Empty
【发布时间】:2011-01-20 15:08:57
【问题描述】:

我有一个 varchar 类型的可为空的数据库字段。我正在为检索该字段值的服务方法编写单元测试。服务方法使用自定义 DAL,如果数据库字段为 Null(这是所需的行为),则返回 String.Empty 的值。

在我的单元测试中,我使用 Linq To SQL 自动生成的类来获取实际的数据库值并根据我的服务方法值对其进行测试。如果数据库字段为 Null,则 L2S 类为字符串分配 Nothing 值。我正在使用 Assert.Equal 来比较这两个值,但是断言失败,因为 Nothing 的字符串值不等于空字符串。我希望这个断言通过,因为它们都代表空数据库值!

对于大多数数据库类型,L2S 类将可空字段公开为可空(T)类型,所以我通常会像这样(VB 代码)测试相等性:

Assert.AreEqual(l2sValue.GetValueOrDefault, myValue, "Values not equivalent.")

但是,可为空的 varchar 只是作为字符串公开,所以我不能在它们上使用 GetValueOrDefault。所以我的问题是,改变我的代码以识别 Nothing 和 String.Empty 的字符串值对于此测试而言是等效的,最优雅的方法是什么?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    与C#不同,VB.Net中的字符串比较treat Nothing as equal to empty string,所以就用这个

    Assert.IsTrue(s1 = s2, "Values are not equivalent")
    

    【讨论】:

    • 这样的缺点是断言没有给我关于失败原因的信息,不像 Assert.AreEqual。
    • 在这种情况下,我建议编写您自己的例程AssertStringsAreEquivalent,以便它给出您希望的任何行为。我想一个缺点是断言将在您的新例程中触发,而不是在未通过测​​试的例程中触发。您可以尝试在新例程msdn.microsoft.com/en-us/library/h5e30exc.aspx 上使用DebuggerHiddenAttribute
    • 奇怪的是StringAssert 没有提供解决此问题的方法。 msdn.microsoft.com/en-us/library/…
    • 感谢链接 Mark,我正在尝试创建自己的程序来断言两个值是等价的,使用泛型和重载来处理特殊情况,例如字符串和可空类型。然后,正如您所指出的,故障点成为一个潜在的问题。
    【解决方案2】:

    如果没有提供值,为什么不将数据库设置为默认为空字符串,而不是NULL?如果您的默认值为'',请告诉数据库——否则它不会知道。从长远来看,这应该可以为您省去很多麻烦。

    【讨论】:

    • 我没有勇气告诉我的数据库管理员,他需要将默认值添加到他拥有 5 年历史的数据库中的所有数千个字段中 :)。此外,我希望我们旧的自定义 DAL 将来会被一个不错的 L2S 或 EF 解决方案取代。
    • 我希望这不是原因,但不幸的是,这是有道理的。那么代码解决方案就是这样。
    【解决方案3】:
    String.IsNullOrEmpty()
    

    【讨论】:

    • 是的,这是我的第一个想法,但我没有看到一个优雅的方法来使用它而不使用 If 语句分成两个测试用例?有没有办法避免这种情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多