CurrentThread.CurrentCulture和单元测试

时间:2014-06-16 12:29:52

标签: c# .net visual-studio unit-testing mono

我有一个错误报告,其中double.Parse(input)使用输入"0.69803923368454"抛出以下异常:

FormatException: Unknown char: .
System.Double.Parse (System.String s, NumberStyles style, IFormatProvider provider) (at  /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Double.cs:209)
System.Double.Parse (System.String s) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Double.cs:180)

经过一些搜索后,当默认文化不支持小数字.时,似乎会出现此问题(请参阅float.Parse fails on decimals and commas);

我需要创建一个单元测试,通过在测试期间强制使用不同的默认文化来重现此问题。当然,这不得干扰任何现有的单元测试。我正在使用随Visual Studio提供的单元测试框架。

这是我尝试过的,但不幸的是,这不会导致报告错误发生:

[TestMethod]
private void DoubleParseWithCultureOverride() {
    var restoreCulture = Thread.CurrentThread.CurrentCulture;
    var restoreUICulture = Thread.CurrentThread.CurrentUICulture;
    try {
        // Arrange
        Thread.CurrentThread.CurrentCulture = new CultureInfo("ko-KR");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("ko-KR");

        // Act
        double value = double.Parse("0.69803923368454");

        // Assert
        Assert.AreEqual(0.69803923368454, value);
    }
    finally {
        Thread.CurrentThread.CurrentCulture = restoreCulture;
        Thread.CurrentThread.CurrentUICulture = restoreUICulture;
    }
}

我期待上面的单元测试失败(即在测试资源管理器面板中变成红色),但它通过了。目前,我纯粹试图用标准的Mono / .NET使用来强制错误。我打算用特定于应用程序的逻辑替换“Act”部分。

1 个答案:

答案 0 :(得分:5)

您刚刚选择了一种恰好使用.作为小数点的文化:

var culture = new CultureInfo("ko-KR");
Console.WriteLine(culture.NumberFormat.NumberDecimalSeparator); // Prints .

我通常使用法语(fr-FR) - 而 会因您当前的代码而失败。

或者,您可以构建自己的CultureInfo专门用于测试,使用您想要的任何分隔符。

对于这样的测试,您可能也想要一种更简单的方法来设置文化。选项:

  • 编写一个方法,采取行动在文化中“执行”,然后将其称为:

    ExecuteInCulture("fr-Fr", () => 
    {
        // Parse a double, or whatever
    });
    
  • 创建IDisposable实施,设置文化并将其恢复到Dispose

    using (CultureHelper.SetCulture("fr-FR"))
    {
        // Parse a double, or whatever
    }
    

前一种方法可能更清晰 - 这并不像你真的有“资源”。