RegionInfo GB文化变迁

时间:2017-02-15 10:03:47

标签: c# unit-testing

我有一个始终有效的单元测试。描述设置为英国英镑(英国)。它现在正在破裂,因为返回的是英镑(英国)。我已经将我的机器更新到Windows 10,但无法判断这是否是这个单元测试破坏的原因。我们的构建服务器现在也是Windows 10,单元测试似乎正在传递该机器。

[TestMethod]
public void CheckEngland()
{
    var currencyData = new CurrencyData("GB");

    Assert.AreEqual("£", currencyData.Symbol);
    Assert.AreEqual("United Kingdom", currencyData.Country);
    Assert.AreEqual("UK Pound Sterling (United Kingdom)", currencyData.Description);
}


public CurrencyData(string countryCode2Letter)
{
    CountryCode2Letter = countryCode2Letter;

    var ri = new RegionInfo(CountryCode2Letter);
    Description = string.Format("{0} ({1})", ri.CurrencyEnglishName, ri.EnglishName);
    Country = ri.EnglishName;
    Symbol = ri.CurrencySymbol;
}

enter image description here

1 个答案:

答案 0 :(得分:1)

可能性1:您要测试的是算法(即CurrencyData对象是根据县代码正确构造的)。选择“ GB”作为国家/地区代码是任意的。而且,为了进行测试,实际的字符串也是任意的:重要的是无论ri.CurrencyEnglishName的内容是什么,都将出现在Descripion字符串的开头。

在这种情况下,由于缺乏隔离性,导致测试失败:ri对象是使用无法控制的外部库创建的。

解决此问题的许多方法之一是,将与外部库进行交互的代码与拥有算法核心的代码隔离开来。例如,您可以创建一个帮助程序函数,该函数将国家/地区代码和现成的RegionInfo对象用作参数,并使用它来设置CurrencyData属性。然后,您可以使用任意创建的RegionInfo对象(在您的控制之下)测试该帮助程序功能。

可能性2:您实际上想测试该货币的原始英文名称。库提供的名称已更改,您的其他代码现在可能会失败,因为它取决于该字符串保持不变。

在这种情况下,您可以从失败的测试中受益,并在构造函数中更正字符串,从而再次提供“ UK Pound Sterling(United Kingdom)”,并且所有现有代码将继续起作用。

在此假设下,您的测试更多是子系统测试性质,而不是单元测试性质。