gpt4 book ai didi

c# - 如何在 .NET 的单个单元测试中修改语言环境小数点分隔符?

转载 作者:行者123 更新时间:2023-11-30 20:40:02 24 4
gpt4 key购买 nike

在 .NET(VB 或 C#)中并使用 Microsoft.VisualStudio.TestTools.UnitTesting 进行单元测试:

如何在单元测试中有效地在本地更改语言环境小数点分隔符,以便 String.Format("{0:0.0}", aDouble)(AFAIK 取决于语言环境) 会生成具有已修改 语言环境的字符串吗?

<强>编辑:注意:我不是在问如何使用特定语言环境输出文本。我在问如何在单元测试中更改区域设置的小数点分隔符,以模拟在具有不同小数点分隔符的系统中会发生什么。我不是从单元测试代码中调用 String.Format,而是从测试功能中调用 String.Format。

附加信息:

我正在用 VB 创建一个 .NET 库,我有一个 MyClass 类,它有一个 Encode(...) 函数,除其他外,它正在编写数字文本形式的信息。

该组件将在不同计算机可能对“十进制分隔符”(逗号或点)有不同配置的环境中使用。然而,我的组件应该对此不敏感,这意味着它应该始终输出“点”(例如,在格式化数字时使用 System.Globalization.CultureInfo.InvariantCulture)。

我想编写一个单元测试以确保即使系统区域设置小数点分隔符设置为“逗号”而不是“点”,编码功能也能继续工作。我做了一些研究并想出了这样的事情:

 Public Sub Encode_CultureWithCommaSeparator_OutputMatchesTemplate()  ...  Dim oldCulture = Threading.Thread.CurrentThread.CurrentCulture  ' A culture that uses "," as decimal separator  Threading.Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("es-ES")  CompareEncodedToTemplate(...)  Threading.Thread.CurrentThread.CurrentCulture = oldCultureEnd Sub

CompareEncodedToTemplate 函数将使用 MyClass.Encode 方法将信息写入 MemoryStream,然后将其与 模板文本文件一行一行,不相等时测试失败。

我想“模拟”的是当区域设置的小数分隔符不同于“point”时 Encode 函数将如何运行。显然我的测试功能没有像我预期的那样工作:

我在我设置的小数分隔符指向的计算机上运行了测试,并且测试成功了,所以我想“我的编码函数将按我的意愿工作,因为测试通过了”。

然而,我在小数分隔符设置为逗号的计算机上运行了测试,但测试失败了。我意识到这是因为在我的 Encode 逻辑中我在格式化 double 时错过了使用 InvariantCulture。这意味着我的测试没有按预期工作,因为我应该能够在第一台计算机上检测到这种情况(因为这是我想要创建测试的原因)。

提前谢谢你。

最佳答案

我的开发机器与我们的 CI 服务器正好遇到了这个问题。我编写了以下结构来提供帮助:

public struct CultureContext : IDisposable
{
public static readonly CultureInfo CommaCulture = new CultureInfo("en-us")
{
NumberFormat =
{
CurrencyDecimalSeparator = ",",
NumberDecimalSeparator = ",",
PercentDecimalSeparator = ","
}
};

public static readonly CultureInfo PointCulture = new CultureInfo("en-us")
{
NumberFormat =
{
CurrencyDecimalSeparator = ".",
NumberDecimalSeparator = ".",
PercentDecimalSeparator = "."
}
};

private readonly CultureInfo _originalCulture;

public CultureContext(CultureInfo culture)
{
_originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = culture;
}

public void Dispose()
{
Thread.CurrentThread.CurrentCulture = _originalCulture;
}

public static void UnderBoth(Action test)
{
using (new CultureContext(PointCulture))
{
test();
}

using (new CultureContext(CommaCulture))
{
test();
}
}
}

然后您可以这样测试它:

CultureContext.UnderBoth(() => Assert.AreEqual("1.1", sut.ToString()));

关于c# - 如何在 .NET 的单个单元测试中修改语言环境小数点分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759702/

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