C#如何测试非负字段结构体的区域性相关ToString方法
Size结构体ToString相关方法单元测试实现方案
不需要找系统预置的特殊区域文化,直接自定义CultureInfo修改非负数字的格式化规则即可,最稳定的实现是修改NumberFormatInfo的NativeDigits属性,替换默认阿拉伯数字为自定义字符,这种方式对非负整数同样生效,完全适配Size字段不能为负的约束。
测试逻辑说明
- 验证
ToString():构造自定义文化,将0-9对应的数字显示字符替换为自定义的特殊字符,设置为当前线程当前文化后调用方法,验证输出中的数字使用了自定义字符,同时固化输出的整体结构(属性名、包裹符号、分隔符格式) - 验证
ToStringInvariant():同样将上述自定义文化设置为线程当前文化,调用方法后验证输出数字始终为标准阿拉伯数字,不受当前线程文化影响 - 所有测试用例必须在
finally块中还原线程原始文化配置,避免污染其他测试的运行环境
测试代码示例
[Test] public void Size_ToString_UsesCurrentCultureFormat() { Size testSize = new Size(12, 34); var originalCulture = Thread.CurrentThread.CurrentCulture; try { // 基于en-US构造自定义文化,关闭用户自定义配置覆盖保证测试稳定性 CultureInfo customCulture = new CultureInfo("en-US", useUserOverride: false); // 将0-9的默认数字替换为带圈数字,制造和固定文化的格式差异 customCulture.NumberFormat.NativeDigits = new string[] { "⓪","①","②","③","④","⑤","⑥","⑦","⑧","⑨" }; Thread.CurrentThread.CurrentCulture = customCulture; string output = testSize.ToString(); Assert.That(output == "{Width=①②, Height=③④}"); } finally { Thread.CurrentThread.CurrentCulture = originalCulture; } } [Test] public void Size_ToStringInvariant_AlwaysUsesInvariantCulture() { Size testSize = new Size(12, 34); var originalCulture = Thread.CurrentThread.CurrentCulture; try { CultureInfo customCulture = new CultureInfo("en-US", useUserOverride: false); customCulture.NumberFormat.NativeDigits = new string[] { "⓪","①","②","③","④","⑤","⑥","⑦","⑧","⑨" }; Thread.CurrentThread.CurrentCulture = customCulture; string output = testSize.ToStringInvariant(); // 固定文化不受自定义配置影响,始终输出标准阿拉伯数字 Assert.That(output == "{Width=12, Height=34}"); } finally { Thread.CurrentThread.CurrentCulture = originalCulture; } }
方案优势
- 不依赖操作系统预置的区域文化数据,跨Windows、Linux、macOS平台运行结果一致,不会因为系统文化定义差异、版本更新导致测试随机失败
- 完全覆盖两个测试要求:既固化了方法输出的固定结构,避免后续迭代出现格式变更,也明确验证了两个方法的文化使用逻辑
- 无需构造负数值,完全适配Size的Width/Height仅允许非负数的约束
内容的提问来源于stack exchange,提问作者Eugeniy Maksimov
相关产品推荐
相关产品推荐

