我有一个CountryManager类,其方法可以返回欧盟所有国家/地区。每个国家/地区都有一个双字母代码(硬编码)和一个来自资源文件的名称。我想创建一个单元测试,检查CountryManager是否返回一个国家并用德语设置其名称。
public class CountryManager
{
public IEnumerable<Country> GetEUCountries()
{
yield return new Country("fr", Resources.France);
yield return new Country("de", Resources.Germany);
//all other EU countries
}
}
我尝试创建以下NUnit测试:
[TestCase("fr", Resources.France)]
[TestCase("de", Resources.Germany)]
public void GetEUCountries_ContainsACountry(string code, string name)
{
var countryManger = new CountryManager();
var countries = countryManger.GetEUCountries();
Assert.IsNotNull(
countries.SingleOrDefault(c=>c.Code == code && c.Name == name)
);
}
但是,由于Resources.France不是编译时常量,因此导致错误。我重构了我的代码,使用静态对象作为数据源:
static object[][] CountriesSource = new object[][]
{
new object[] {"fr", Resources.France },
new object[] {"de", Resources.Germany}
};
[TestCaseSource(nameof(CountriesSource))]
public void GetEUCountries_ContainsACountry(string code, string name)
这是按预期工作但另一个认为我想测试的是德国人的名字是正确的。 NUnit支持可用于方法,类或程序集级别的SetCulture和SetUICulture属性。但是,它们都没有为我工作 - 在测试资源管理器中我总是得到英文字符串: enter image description here
我发现让测试资源管理器发现并运行德语测试的唯一方法是将我的TestCaseSource重构为属性并在getter中设置文化:
static object[][] CountriesSource
{
get {
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de");
return new object[][]
{
new object[] {"fr", Resources.France },
new object[] {"de", Resources.Germany}
};
}
}
[TestCaseSource(nameof(CountriesSource))]
结果是TestExplorer以德语正确显示和运行测试:
然而,这是一个令人讨厌的解决方法,我需要在许多地方应用(所有单元测试项目中的所有静态测试用例源)。有没有办法全局设置TestRunner的文化(当我调试时,我看到它获得了我的本地文化,理想情况下我可以将其更改为德语)?