何时在C#中使用Assert.AreEqual()比较字符串时传递Culture

时间:2014-11-25 09:44:36

标签: c# unit-testing cultureinfo

我遇到过其他开发人员编写的一些单元测试,这些测试经常使用Assert.AreEqual的重载版本,如下所示:

 Assert.AreEqual(stringparamX, stringParamY, true, CultureInfo.InvariantCulture);

stringParamX在单元测试中设置,stringparamY将是被测系统的结果。

可能会将此代码移植到其他国家/地区,并且可能会执行这些测试。但是,在查看MSDN docs for Culture时,我不禁想到传入CultureInfo.InvariantCulture会增加一些不必要的复杂性。如果在其他文化中执行,我不确定它会对测试产生什么样的影响。

在我的情况下进行单元测试的情况下,我为什么要(或不)写这样的断言?

2 个答案:

答案 0 :(得分:3)

如果您将文化指定为InvariantCulture,则没有理由使用该重载,因为这是默认值。

来自the documentation here

  

使用不变文化进行比较。

请注意,在某些情况下,如果您没有使用InvariantCulture,那就会产生影响,最臭名昭着的是"The Turkish I problem"

以下代码说明了问题:

Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");

Assert.AreEqual("i", "I", true, CultureInfo.CurrentCulture);   // This throws.
Assert.AreEqual("i", "I", true, CultureInfo.InvariantCulture); // This doesn't throw.
Assert.AreEqual("i", "I", true);                               // This doesn't throw.

但请注意,您不会受到影响,因为您使用的是不变文化。

答案 1 :(得分:2)

Assert.AreEqual的MSDN documentation采取"备注"中的CultureInfo状态。部分:

  

不变文化用于比较

如果为true,则明确指定它在技术上是不必要的。然后,关于明确是否更好是一个没有实际意义的点。

话虽如此,这取决于正在测试的是否应该考虑将文化用于不区分大小写的字符串比较。