如果这是重复的,请道歉;我保证我确实搜查过。
我正在Visual Studio 2010 Professional中使用NUnit进行C#集成测试项目,使用Resharper v6.1运行测试。(Resharper 6.1规定我使用NUnit 2.5.10;我一直很难覆盖它。)
我测试的一部分是断言抛出了正确的异常,包括异常消息。但是,有时异常消息包含一个guid或其他信息,我不希望每次都完全相同。为了解决这个问题,我想使用一个基本的regex模式来匹配异常消息,在这个模式中我包括异常消息,并简单地使用通配符,在某些地方说"这部分可以匹配任何东西",我在下面的场景中尝试过这样做,但每次我收到一个没有匹配的错误。代码摘要:
[Test]
public void ExceptionPatternTest()
{
var patternA = Regex.Escape(@"SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'.");
var patternB = ".*"; //wildcard
var patternC = Regex.Escape(@"rnThe statement has been terminated.");
var pattern = patternA + patternB + patternC;
var thrownException = Assert.Throws(Is.TypeOf(_testException.GetType()),
() => Throw()); //Call method and assert that exception is thrown.
Assert.That(Regex.IsMatch(thrownException.Message, pattern));
}
private void Throw()
{
throw _testException;
}
readonly Exception _testException = new Exception("SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'. The duplicate key value is (9fec90c1-12b4-42c3-adc0-a0d600b9a8e8, 1, Item Cat 1).rnThe statement has been terminated.");
我也尝试过对其中的部分进行变体。包括模式的手动字符转义:
var pattern = @"SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'..*\r\nThe statement has been terminated.";
我也尝试过StringAssert,以防出现差异:
StringAssert.IsMatch(pattern, thrownException.Message);
提前感谢您的帮助!此外,如果我只是错过了一些非常愚蠢的东西,请道歉。我只是少量地使用regex,所以这当然是可能的。
Regex.Escape(@"rn")
将生成\r\n
,这不是您想要的。我建议将换行移到未跳过的字符串:
var patternB = @".*rn";
var patternC = Regex.Escape(@"The statement has been terminated.");
既然可以只使用string.StartsWith
和string.EndsWith
来检查前缀和后缀,为什么要使用复杂的正则表达式?更少的代码,更容易阅读,并且不必费力地试图找出为什么一件看似简单的事情不能正常工作。