C# 如何在nunit中测试包含本地化日期的异常消息
我刚刚在我们的一个单元测试中遇到了一个有趣的问题。在这种情况下,我们试图确保当遇到特定的异常情况时,我们抛出并向处理程序提供有用的消息——其思想是处理程序可以直接显示(或记录)该消息。问题是当消息包含日期时-我们希望使用用户的区域设置和他们在本地系统上指定的任何覆盖来表示该日期 问题的产生是因为我们有两个不同的CI基础设施(不问——一个开发,一个发布),由于各种原因,实际上有两个(稍微)不同的日期设置——一个通过了下面的测试,而另一个使用类似于“2014年1月14日”的(定制)日期格式C# 如何在nunit中测试包含本地化日期的异常消息,c#,unit-testing,nunit,C#,Unit Testing,Nunit,我刚刚在我们的一个单元测试中遇到了一个有趣的问题。在这种情况下,我们试图确保当遇到特定的异常情况时,我们抛出并向处理程序提供有用的消息——其思想是处理程序可以直接显示(或记录)该消息。问题是当消息包含日期时-我们希望使用用户的区域设置和他们在本地系统上指定的任何覆盖来表示该日期 问题的产生是因为我们有两个不同的CI基础设施(不问——一个开发,一个发布),由于各种原因,实际上有两个(稍微)不同的日期设置——一个通过了下面的测试,而另一个使用类似于“2014年1月14日”的(定制)日期格式 我知道和
我知道和属性,但由于机器上日期格式的定制方面,我不相信它们会起作用。是否可以忽略自定义设置,至少在测试中使用区域设置的默认值?而不是使用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
}
与其使用ExpectedException属性,为什么不重写测试以显式捕获异常并测试消息?嗯,好主意。我只是没有想到这一点,希望尽可能多地利用这个框架。戴夫-如果你把它作为一个答案,我会接受的。谢谢你的提示。
[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
}