我有一个单元测试一直有效。这个描述被设定为英国英镑(英国)。现在它正在破裂,因为正在归还的是英镑(联合王国)。从那以后,我已经将我的机器升级到了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;
}

发布于 2018-10-22 21:36:02
可行性1:您想要测试的是算法(即,CurrencyData对象是根据郡代码正确构造的)。选择"GB“作为国家代码完全是武断的。而且,为了测试起见,实际的字符串也是任意的:重要的是,无论ri.CurrencyEnglishName的内容是什么,都会发生在Descripion字符串的开头。
在这种情况下,您的测试由于缺乏隔离而失败:ri对象是用一个无法控制的外部库创建的。
解决这个问题的许多方法之一是将与外部库交互的代码与包含算法核心的代码隔离开来。例如,您可以创建一个助手函数,该函数获取国家代码和现成的RegionInfo对象作为参数,并使用该函数设置CurrencyData属性。然后,您可以使用任意创建的RegionInfo对象(在您的控制下)测试此助手函数。
可能性2:您实际上想要测试货币的原始英文名称的。库传递的名称已经更改,您的其他代码现在可能会失败,因为它依赖于该字符串保持不变。
在这种情况下,您可以从失败的测试中受益,并更正构造函数中的字符串,这样就可以再次交付"UK constructor (联合王国)“,并且所有现有代码都继续工作。
在这种假设下,您的测试更像是子系统测试性质,而不是单元测试性质。
https://stackoverflow.com/questions/42246167
复制相似问题