RegionInfo GB 文化变化
RegionInfo GB culture change
我有一个单元测试一直有效。 Description 设置为 UK Pound Sterling(英国)。它现在正在中断,因为返回的是英镑(英国)。我已经将我的机器更新为 windows 10,但无法判断这是否是此单元测试失败的原因。我们的构建服务器现在也是 windows 十,单元测试似乎正在该机器上通过。
[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;
}
可能性 1: 您要测试的是算法(即,CurrencyData
对象是根据县代码正确构造的)。 "GB" 作为国家代码的选择是任意的。而且,为了测试,实际的字符串也是任意的:重要的是,无论 ri.CurrencyEnglishName
的内容是什么,都会出现在 Descripion
字符串的开头。
在这种情况下,您的测试由于缺乏隔离而失败:ri
对象是使用您无法控制的外部库创建的。
解决此问题的众多方法之一是将与外部库交互的代码与拥有算法核心的代码隔离开来。例如,您可以创建一个辅助函数,将国家代码和现成的 RegionInfo
对象作为参数,并使用它来设置 CurrencyData
属性。然后,您可以使用任意创建的 RegionInfo
个对象(在您的控制下)来测试这个辅助函数。
可能性2:你其实是想测试货币的英文原名。库提供的名称已更改,您的其他一些代码现在可能会失败,因为它取决于保持不变的字符串。
在这种情况下,您可以从失败的测试中获益并更正构造函数中的字符串,以便再次交付 "UK Pound Sterling (United Kingdom)",并且所有现有代码继续工作。
在此假设下,您的测试更像是子系统测试性质,而不是单元测试性质。
我有一个单元测试一直有效。 Description 设置为 UK Pound Sterling(英国)。它现在正在中断,因为返回的是英镑(英国)。我已经将我的机器更新为 windows 10,但无法判断这是否是此单元测试失败的原因。我们的构建服务器现在也是 windows 十,单元测试似乎正在该机器上通过。
[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;
}
可能性 1: 您要测试的是算法(即,CurrencyData
对象是根据县代码正确构造的)。 "GB" 作为国家代码的选择是任意的。而且,为了测试,实际的字符串也是任意的:重要的是,无论 ri.CurrencyEnglishName
的内容是什么,都会出现在 Descripion
字符串的开头。
在这种情况下,您的测试由于缺乏隔离而失败:ri
对象是使用您无法控制的外部库创建的。
解决此问题的众多方法之一是将与外部库交互的代码与拥有算法核心的代码隔离开来。例如,您可以创建一个辅助函数,将国家代码和现成的 RegionInfo
对象作为参数,并使用它来设置 CurrencyData
属性。然后,您可以使用任意创建的 RegionInfo
个对象(在您的控制下)来测试这个辅助函数。
可能性2:你其实是想测试货币的英文原名。库提供的名称已更改,您的其他一些代码现在可能会失败,因为它取决于保持不变的字符串。
在这种情况下,您可以从失败的测试中获益并更正构造函数中的字符串,以便再次交付 "UK Pound Sterling (United Kingdom)",并且所有现有代码继续工作。
在此假设下,您的测试更像是子系统测试性质,而不是单元测试性质。