gpt4 book ai didi

c# - CurrentThread.CurrentCulture 和单元测试

转载 作者:行者123 更新时间:2023-11-30 14:55:55 25 4
gpt4 key购买 nike

我有一个错误报告,其中 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”部分。

最佳答案

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

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
    }

前一种方法可能更简洁 - 这并不是说您真的在这里获得了“资源”。

关于c# - CurrentThread.CurrentCulture 和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24243774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com