2

これが重複している場合はお詫びします。私は検索したことを約束します。

Visual Studio 2010 ProfessionalでNUnitを使用してC#統合テストプロジェクトに取り組んでおり、Resharperv6.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.StartsWithして確認できるのに、なぜ複雑な正規表現を使用するのですか?string.EndsWithコードが少なく、読みやすく、一見単純なことが正しく機能しない理由を理解しようとすることについて混乱することはありません。

于 2012-12-03T18:42:35.817 に答える