2011-03-21 51 views
3

在我正在测试的应用程序中,我想确保对某些输入记录器被调用。一些方法有不同的可能的记录器消息(例如“值格式错误”,“值超出范围”)。因此,我想确保记录器被正确的消息调用。如何使用正确的可本地化格式化字符串来调用记录器的单元测试?

自动存档的记录器字符串在RESX中,可能在将来进行本地化。此外,措辞可能会改变。因此,只要与硬编码的字符串进行比较,只要文本发生变化就可能导致相关测试中断。由于它们是可本地化的,这意味着我将不得不迫使单元测试在特定文化下执行,或者有更好的方法吗?

使之复杂化,RESX字符串实际上并不像上面那样简单,而是形式为"Line {0}: Value '{1}' at column {2} is malformed."然后将其用作string.Format()的输入以生成"Line 12: Value '12a.45' at column 45 is malformed.",例如。这是记录器实际得到的字符串。我应该将这个字符串硬编码到单元测试中吗?

编辑:

我会尝试一些更详细的解释,有非常简化的方法来说明我的意思:

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)); 
    } 
} 

如何测试记录器被称为与正确的信息?我不能简单地检查是否有任何对记录器的调用。如果我给它一个有效但超出范围的值,但是有效性检查有一个错误,它会调用记录器,但带有“无效值”的消息,实际上应该是“超出范围”。

我可以模拟记录器,所以我可以看到它被调用,参数是什么。但是我应该坚持什么?

+0

我认为这是一个整合,甚至是QA水平测试。我甚至不确定如何让机器以可靠的方式交换语言。 – 2011-03-21 11:21:38

回答

3

如果文化存在于机器上,您可以更改代码中当前的线程文化。如果它不存在,则需要安装/创建它。

至于比较应用程序中使用的字符串(可能会改变),我会建议不要做那个测试的目标。

相反,也许在静态的每个资源中都有一个理智的测试字符串,并对其进行测试。如果这种变化与文化,那么你已经加载了正确的资源,并可以安全地假设其余的内容也是正确的。

NUnit的支持不断变化的测试工具的文化:

http://www.nunit.org/index.php?p=culture&r=2.4.8

更新:我看到那么这个问题是测试不能直视的记录?我建议你可以模拟一个记录器,而不是知道它正在测试并包含它自己的断言,或者放弃测试记录器本身并测试当前正在文化变化中加载的附属程序集。如果记录器只是使用资源文件,那么.NET运行时将处理正确文件的加载或默认为基本文化文件。

然后,您可以单独进行测试,以显示记录器记录日志,而不用担心它记录的内容,因为它在另一个测试中涉及。

更新2:我想我明白你在做什么。是否有可能让记录器接受字符串格式和params object[] args以在使用特定值插入字符串之前访问字符串?

另外,是否有可能使字符串是静态的还是通过本质改变每次测试运行?如果测试本身负责首先对值进行排序,那么对于测试来说,在它们中使用硬编码的值是有效的。此外,就文化而言,我将分别将这些更改解决为由不同代码路径选择不同消息引入的更改。

更新3:对不起,我看不到树木。测试本身可以从代码使用的resx文件中构建预期的字符串 - 并插入硬编码值。这依赖于测试输出与每次运行没有不同。

如果resx发生变化,那么只要插入格式化字符串的值的数量不变,就不需要修复代码或测试。

+0

问题是,我已经有了SUT在错误的执行路径下发生错误信息的情况。我给它一个超出范围(但是有效)的值,但它被记录为“格式不正确”。测试是绿色的(因为记录器被调用),但是信息是错误的,所以它应该是红色的。 – 2011-03-21 11:27:05

+0

我有一个假记录器,在那里我可以看到叫什么(以及什么参数)。但是,记录器在第45列中得到''第12行:值'12a.45'的格式不正确。“例如,它是由包含占位符的RESX字符串生成的,该字符串包含string.Format()。我应该在测试中硬编码结果字符串吗?或者,还有更好的方法? – 2011-03-21 11:36:53

+0

还有一种更好的方法,让它记录一种测试值,这种测试值会因文化的不同而有所不同,但最重要的是它不会从创建时开始变化,因此测试可以保持静态。如果单元测试在代码中产生差异,那么管理文化是完全有效的。我的理解是你没有测试字符串,你正在测试记录器是否倾听文化。 – 2011-03-21 11:38:43

0

您创建一个假记录器,并监视它的代码在需要时调用它。

+0

我已经有一个假记录器,可以看到它被调用。但是,我在测试方法中对记录器有不同的可能调用,并且要确保正在对记录器进行正确的调用。 – 2011-03-21 11:31:55

+0

然后执行假冒所以它拦截那些特殊情况,所以你可以对它们进行断言。 – Morten 2011-03-21 11:37:25

相关问题