You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Percentage Format Specifier在GitHub Actions与本地测试结果不一致求助

百分比格式化跨环境断言失败的原因与解决办法

问题根源

你遇到的核心问题是C#字符串格式化默认依赖运行环境的CultureInfo,而Windows本地机器和GitHub Actions的运行容器(通常是Linux)默认使用的区域文化规则不一致:

  • 你的Windows本地默认区域文化的百分比格式规则是数值与%之间带空格,生成"18.00 %"
  • GitHub Actions容器的默认区域文化规则是数值与%之间无空格,生成"18.00%"

虽然赋值和断言用了完全相同的格式化代码,但两者运行在不同环境,默认区域文化不同,最终生成的字符串自然存在差异。

解决办法

要消除跨环境的差异,必须显式指定固定的区域文化,不能依赖系统默认值,以下是两种可行方案:

方案1:格式化时显式指定区域文化

修改赋值和断言代码,统一使用InvariantCulture(它的格式化规则不随环境变化):

赋值代码:

using System.Globalization;

var report = new SaleReportDto()
{
    TaxPercentage = string.Format(CultureInfo.InvariantCulture, "{0:P2}", 0.18)
};

断言代码:

using System.Globalization;

var expectedValue = string.Format(CultureInfo.InvariantCulture, "{0:P2}", 0.18);
report.TaxPercentage.Should().Be(expectedValue);

方案2:全局设置测试项目的默认区域文化

如果不想在每个格式化的地方都指定区域文化,可以在测试项目的初始化阶段全局设置默认规则,确保所有测试代码都使用统一标准:

using System.Globalization;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class GlobalTestInitializer
{
    [AssemblyInitialize]
    public static void SetDefaultCulture(TestContext context)
    {
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
        CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
    }
}

注意事项

你临时用的report.TaxPercentage.Contains("18")虽然能通过测试,但这种断言过于宽松——如果实际生成的是"81.00%"这类错误值也会被判定为通过,无法有效检测逻辑问题,不建议长期使用。

内容的提问来源于stack exchange,提问作者fingers10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:30:42