如何在nunit中测试包含本地化日期的异常消息

时间:2014-10-04 13:54:56

标签: c# unit-testing nunit

我刚刚遇到一个有趣的问题,我们的一个单元测试。这是我们尝试确保在遇到特殊情况时,我们抛出并向处理程序提供有用信息的情况 - 理念是处理程序可以只显示(或记录)消息直接。问题是当消息包含日期时 - 我们希望使用用户区域设置以及它们可能在本地系统上指定的任何覆盖来表示该日期。

问题出现是因为我们有两个不同的CI基础设施(不要问 - 一个开发,一个发布)由于各种原因,实际上有两个(稍微)不同的日期设置 - 一个通过下面的测试,而其他使用类似于" 14Jan2014"(

)的(自定义)日期格式
[Test]
[ExpectedException(typeof(InvalidOperationException), ExpectedMessage="Invalid date: 14/01/2014")]
public void ExampleTest()
{
    var date = new DateTime(2014, 01, 14);
    throw new InvalidOperationException("Invalid date: " + date.ToString());
}

我知道SetCultureCulture属性,但由于机器上日期格式的自定义方面,我不相信这些属性会起作用。是否有可能以某种方式忽略自定义设置,并至少使用区域设置的默认值进行测试?

2 个答案:

答案 0 :(得分:3)

不要使用ExpectedException属性,而是重写测试以显式捕获异常并测试消息。

答案 1 :(得分:1)

你可以在他的回答中明确地捕获@Dave Mackersie所提到的异常,或者你可以将ExpectedException属性与异常处理程序一起使用

[ExpectedException(Handler = "HandleException")]

您的测试将是

[Test]
[ExpectedException(Handler = "HandleException")]
public void ExampleTest()
{
    var date = new DateTime(2014, 01, 14);
    throw new InvalidOperationException("Invalid date: " + date.ToString());
}

public void HandleException(Exception ex)
{
    if (!(ex is InvalidOperationException))
        Assert.Fail("Unexpected type of exception thrown by method");

    // Compare expected exception message with ex.Message
    // Assert.Fail if they do not match
}