2

抱歉,如果这是重复的;我保证我确实搜索过。

我正在使用 Visual Studio 2010 Professional 中的 NUnit 进行 C# 集成测试项目,并使用 Resharper v6.1 运行测试。(Resharper 6.1 规定我使用 NUnit 2.5.10;我一直无法尝试覆盖它。)

我的部分测试是断言正确的异常被抛出,包括异常消息。但是,有时异常消息包含我不希望每次都完全相同的 guid 或其他信息。为了解决这个问题,我想使用包含异常消息的基本正则表达式模式匹配异常消息,并简单地使用通配符在某些地方说“这部分可以匹配任何东西”我试图在下面的场景,但每次我得到一个没有匹配的错误。代码摘要:

[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(@"\r\nThe 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).\r\nThe 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);

在此先感谢您的帮助!另外,如果我只是错过了一些非常愚蠢的东西,我深表歉意。我只很少使用正则表达式,所以这当然是可能的。

4

2 回答 2

4

Regex.Escape(@"\r\n")会产生\\r\\n,这不是你想要的。我建议将换行符移至未转义的字符串:

var patternB = @".*\r\n";
var patternC = Regex.Escape(@"The statement has been terminated.");    
于 2012-12-03T18:37:22.780 回答
0

当您可以使用string.StartsWithandstring.EndsWith来检查前缀和后缀时,为什么还要使用复杂的正则表达式?更少的代码,更容易阅读,并且不会为试图找出为什么看似简单的事情不能正常工作而烦恼。

于 2012-12-03T18:42:35.817 回答