我有一个始终有效的单元测试。描述设置为英国英镑(英国)。它现在正在破裂,因为返回的是英镑(英国)。我已经将我的机器更新到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;
}
答案 0 :(得分:1)
可能性1:您要测试的是算法(即CurrencyData
对象是根据县代码正确构造的)。选择“ GB”作为国家/地区代码是任意的。而且,为了进行测试,实际的字符串也是任意的:重要的是无论ri.CurrencyEnglishName
的内容是什么,都将出现在Descripion
字符串的开头。
在这种情况下,由于缺乏隔离性,导致测试失败:ri
对象是使用无法控制的外部库创建的。
解决此问题的许多方法之一是,将与外部库进行交互的代码与拥有算法核心的代码隔离开来。例如,您可以创建一个帮助程序函数,该函数将国家/地区代码和现成的RegionInfo
对象用作参数,并使用它来设置CurrencyData
属性。然后,您可以使用任意创建的RegionInfo
对象(在您的控制之下)测试该帮助程序功能。
可能性2:您实际上想测试该货币的原始英文名称。库提供的名称已更改,您的其他代码现在可能会失败,因为它取决于该字符串保持不变。
在这种情况下,您可以从失败的测试中受益,并在构造函数中更正字符串,从而再次提供“ UK Pound Sterling(United Kingdom)”,并且所有现有代码将继续起作用。
在此假设下,您的测试更多是子系统测试性质,而不是单元测试性质。