次の方法で共有


MSTEST0051: Assert.Throws には 1 つのステートメントのみを含める必要があります

プロパティ 価値
ルール識別子 MSTEST0051
タイトル Assert.Throws には 1 つのステートメントのみを含める必要があります
カテゴリ Usage
修正が破壊的であるか非破壊的であるか Non-breaking
既定で有効 イエス
既定の重大度 Info
バージョン で導入された 3.11.0
コード修正はありますか いいえ

原因

ThrowsThrowsAsyncThrowsExactly、またはThrowsExactlyAsyncへの呼び出しには、アクション デリゲートに複数のステートメントが含まれています。

ルールの説明

例外をスローすることが予想される特定のメソッド呼び出しのみがテストされるようにするには、 Assert.ThrowsAssert.ThrowsAsyncAssert.ThrowsExactly、または Assert.ThrowsExactlyAsync に渡されるアクション デリゲートにステートメントを 1 つだけ含める必要があります。 複数のステートメントを含めると、スローを意図していないステートメントによって例外がスローされたときにテストが渡される可能性があります。 スローを意図したアクションの最後のステートメントでない場合、テストにはデッド コードがあります。 最後のステートメントの場合は、意図を明確に記述する必要があります。

違反を修正する方法

テストをリファクタリングして、アクション デリゲートに例外をスローすることが予想される単一のステートメントのみが含まれていることを確認します。 アサーション呼び出しの外部にセットアップ コードを移動します。

たとえば、次の内容を変更します。

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    Assert.ThrowsExactly<InvalidOperationException>(() =>
    {
        obj.Initialize();
        obj.Execute(); // Only this should be inside the assertion
    });
}

この行を次のように変更します。

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    obj.Initialize();
    Assert.ThrowsExactly<InvalidOperationException>(() => obj.Execute());
}

警告を抑制するタイミング

このルールの警告を抑制しないでください。 アクション デリゲートに複数のステートメントを含めると、テスト対象の操作が不明になり、元の意図に違反したときにテストに合格する可能性があります。