Lea*_*yes 3 .net c# mono unit-testing visual-studio
我有一个错误报告,其中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)
Run Code Online (Sandbox Code Playgroud)
经过一些搜索之后,似乎默认的区域性不支持小数点字符时就会发生此问题.
(请参见float.Parse在小数点和逗号处失败);
我需要创建一个单元测试,通过在测试期间强制使用不同的默认区域性来重现此问题。自然,这一定不能干扰任何现有的单元测试。我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我期望上述单元测试失败(即在“测试资源管理器”面板中变为红色),但是通过了。目前,我纯粹是在尝试使用标准Mono / .NET使用该错误。我打算将“ Act”部分替换为特定于应用程序的逻辑。
您刚刚选择了一种恰好.
用作小数点的区域性:
var culture = new CultureInfo("ko-KR");
Console.WriteLine(culture.NumberFormat.NumberDecimalSeparator); // Prints .
Run Code Online (Sandbox Code Playgroud)
我通常fr-FR
为此使用法语(),但您当前的代码确实会失败。
另外,您可以CultureInfo
使用任何所需的分隔符来构造自己的专用于测试的对象。
对于这样的测试,您可能还需要一种更简单的方式来设置文化。选项:
编写一个采取措施在文化中“执行”的方法,然后将其称为:
ExecuteInCulture("fr-Fr", () =>
{
// Parse a double, or whatever
});
Run Code Online (Sandbox Code Playgroud)创建一个IDisposable
设置区域性并将其恢复的实现Dispose
:
using (CultureHelper.SetCulture("fr-FR"))
{
// Parse a double, or whatever
}
Run Code Online (Sandbox Code Playgroud)前一种方法可能更清洁-好像您在这里没有真正的“资源”。
归档时间: |
|
查看次数: |
1697 次 |
最近记录: |