单元测试如何使用正确的可本地化的格式化字符串调用记录器?
作者:互联网
在我正在测试的应用程序中,我想确保对于某些输入,正在调用记录器.某些方法可能具有不同的记录器消息(例如“值格式错误”,“值超出范围”).因此,我想确保使用正确的消息调用记录器.
它们自己保存的记录器字符串位于RESX中,将来可能会本地化.同样,措辞可能会更改.因此,只要将文本更改,仅将其与硬编码的字符串进行比较就可能会破坏相关的测试.由于它们是可本地化的,这意味着我将不得不强制在某种文化下执行单元测试,还是有更好的方法?
复杂的是,RESX字符串实际上并不像上面那样简单,而是形式为“行{0}:列{2}的值'{1}’格式错误”.然后,将其用作string.Format()的输入,以产生“第12行:第45列的值’12a.45’格式错误.”.这是记录器随后实际获取的字符串.我应该将该字符串硬编码到单元测试中吗?
编辑:
我将尝试使用更简化的方法来更详细地说明我的意思:
public void ConvertSomething(object value)
{
if (/* Check if valid value */)
{
var convertedValue = /* Some conversion */ ;
if (/* Check is in range */)
{
// Do something
}
else
{
Logger.Log(string.Format(Resources.OutOfRange, LineNumber, convertedValue));
}
}
else
{
Logger.Log(string.Format(Resources.InvalidValue, LineNumber, value, ColumnNumber));
}
}
如何测试记录器是否以正确的消息被调用?我不能简单地检查是否对记录器进行了任何调用.如果我给它一个有效但超出范围的值,但是有效性检查有一个错误,它将调用记录器,但带有消息“无效值”,而实际上它应该是“超出范围”.
我可以模拟记录器,因此可以看到它被调用以及参数是什么.但是我该反对什么呢?
解决方法:
如果计算机上存在区域性,则可以更改代码中的当前线程区域性.如果不存在,则需要安装/创建.
至于比较应用程序中使用的字符串(可能会更改),我建议不要将其作为测试的目标.
相反,也许在每个静态资源中都有一个健全性测试字符串,然后对此进行测试.如果这种情况随着文化的变化而变化,那么您已经加载了正确的资源,并且可以放心地假定其余内容也是正确的.
NUnit支持更改测试工具的文化:
http://www.nunit.org/index.php?p=culture&r=2.4.8
更新:我看到了,所以问题是测试无法进入记录仪?我建议您可以嘲笑一个记录器,而不知道它正在被测试并包含其自己的断言,或者放弃测试记录器本身,而测试是否在当前区域性变更中加载了卫星程序集.如果记录器仅使用资源文件,则.NET运行时将处理正确文件的加载或默认为基本区域性文件的加载.
然后,您可以进行单独的测试以显示记录器记录日志,而不必担心记录在另一个测试中的记录.
更新2:我想我明白您正在尝试做什么.是否可以让记录器接受字符串格式和params object [] args,以便在使用特定值插入字符串之前获得对该字符串的访问权?
或者,可以将字符串设置为静态,还是自然而然地更改每次测试运行?如果测试本身首先负责将值植入种子,则对测试进行硬编码是有效的.同样,对于文化,我将分别针对那些由选择不同消息的不同代码路径引入的更改进行处理.
更新3:对不起,我看不见树木的树木.测试本身可以从代码使用的resx文件中构建期望的字符串-并插入硬编码的值.这取决于测试输出与每次运行没有区别.
如果resx发生更改,则只要插入格式化字符串中的值的数量不变,就无需修复代码或测试.
标签:unit-testing,c,net 来源: https://codeday.me/bug/20191208/2092679.html