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

本文关键字:日期 本地化 异常 消息 包含 测试 nunit | 更新日期: 2023-09-27 18:25:29

我刚刚在一个单元测试中遇到了一个有趣的问题。在这种情况下,我们试图确保当遇到特定的异常情况时,我们向处理程序抛出并提供有用的消息——其想法是处理程序可以直接显示(或记录)该消息。问题是,当消息包含日期时,我们希望使用用户区域设置和他们在本地系统上指定的任何重写来表达该日期。

问题的出现是因为我们有两个不同的CI基础设施(不要问-一个开发,一个发布),由于各种原因,它们实际上有两个(稍微)不同的日期设置-一个通过了下面的测试,而另一个使用类似于"2014年1月14日"的(自定义)日期格式。

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

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

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

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

您可以显式捕获@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
}