VS2017的.NET Core 2.0 xUnit项目使用UseCultureAttribute报错求解决
解决xUnit中找不到
UseCultureAttribute的问题 你遇到的这个错误很常见——因为UseCultureAttribute并不是xUnit核心库自带的特性,你看到的示例里的这个特性是该示例项目自己实现的自定义特性,所以你的项目里没有这个类型才会报错。下面给你两种解决办法:
方法一:复制示例中的自定义UseCultureAttribute实现
直接把示例里的自定义特性代码复制到你的项目中,这样就能和示例一样使用这个特性了:
using System; using System.Globalization; using System.Reflection; using Xunit.Sdk; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class UseCultureAttribute : BeforeAfterTestAttribute { private readonly CultureInfo _originalCulture; private readonly CultureInfo _originalUICulture; public UseCultureAttribute(string culture) : this(culture, culture) { } public UseCultureAttribute(string culture, string uiCulture) { _originalCulture = CultureInfo.CurrentCulture; _originalUICulture = CultureInfo.CurrentUICulture; CultureInfo.CurrentCulture = new CultureInfo(culture); CultureInfo.CurrentUICulture = new CultureInfo(uiCulture); } public override void After(MethodInfo methodUnderTest) { CultureInfo.CurrentCulture = _originalCulture; CultureInfo.CurrentUICulture = _originalUICulture; } }
添加这段代码后,你的测试代码就能正常运行了。
方法二:手动在测试中切换文化
如果不想额外添加自定义类,也可以在测试方法内部手动设置并恢复文化,避免影响其他测试:
[Fact] public void Test1() { // 保存当前系统的原有文化设置 var originalCulture = CultureInfo.CurrentCulture; var originalUICulture = CultureInfo.CurrentUICulture; try { // 设置测试需要的文化 CultureInfo.CurrentCulture = new CultureInfo("en-US"); CultureInfo.CurrentUICulture = new CultureInfo("en-US"); double a = 5.01; string aStr = a.ToString(); Assert.Equal("5.01", aStr); } finally { // 测试结束后恢复原有文化,避免影响其他测试 CultureInfo.CurrentCulture = originalCulture; CultureInfo.CurrentUICulture = originalUICulture; } }
补充说明
xUnit核心库没有内置文化切换的特性,因为这类属于测试场景的辅助功能,通常由开发者根据需求自行实现,或者使用社区提供的扩展包。你看到的示例只是展示了一种自定义特性来简化这类测试的写法。
内容的提问来源于stack exchange,提问作者Adem Catamak
相关产品推荐
相关产品推荐

