设置visual studio test runner

时间:2018-04-23 14:10:31

标签: c# visual-studio nunit

我有一个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以德语正确显示和运行测试:

enter image description here

然而,这是一个令人讨厌的解决方法,我需要在许多地方应用(所有单元测试项目中的所有静态测试用例源)。有没有办法全局设置TestRunner的文化(当我调试时,我看到它获得了我的本地文化,理想情况下我可以将其更改为德语)?

0 个答案:

没有答案