2010-02-24 60 views
1

我有一个类型为varchar的可为空的数据库字段。我正在为检索此字段的值的服务方法编写单元测试。如果数据库字段为Null(这是期望的行为),则service方法使用返回String.Empty值的自定义DAL。Nothing的测试字符串值等于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是相同的测试的目的?

回答

1
String.IsNullOrEmpty() 
+0

是的,这是我的第一个想法,但我没有看到一个优雅的方式来使用这个没有分裂成两个测试用例使用If语句?有没有办法避免这种情况? – elwy 2010-02-24 17:07:01

0

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

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

这一点的不足之处在于,与Assert.AreEqual不同的是,断言并不能告诉我们为什么失败。 – elwy 2010-02-25 10:57:10

+0

在这种情况下,我建议编写自己的例程'AssertStringsAreEquivalent',这样它就可以给出你想要的任何行为。我想一个缺点是,断言在你的新例程中会触发,而不是在例行测试失败的情况下。您可以尝试在新例程中使用'DebuggerHiddenAttribute' http://msdn.microsoft.com/en-us/library/h5e30exc.aspx – MarkJ 2010-02-25 11:35:33

+0

“StringAssert”没有提供方法来解决这个问题,这很奇怪。 http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.stringassert_members(VS.80).aspx – MarkJ 2010-02-25 11:37:00

1

为什么不将数据库设置为默认为空字符串,而不是NULL,如果没有提供的价值?如果您的默认值是'',请告诉DB--它不会知道其他情况。这从长远来看应该会为您节省很多麻烦。

+0

我没有胆量告诉我的数据库管理员,他需要将默认值添加到他5岁的数据库中的所有数千个字段:)。此外,我希望将来我们的旧定制DAL将被替换为一个不错的L2S或EF解决方案。 – elwy 2010-02-25 12:35:40

+0

我希望这不是理由,但不幸的是,这是有道理的。那么代码解决方案就是这样。 – 2010-02-25 13:17:17