次の方法で共有


MSTEST0006: Avoid [ExpectedException] ([ExpectedException] を避ける)

プロパティ
ルール ID MSTEST0006
Title Avoid [ExpectedException] ([ExpectedException] を避ける)
カテゴリ デザイン
修正が中断ありか中断なしか なし
既定で有効 はい
既定の重要度 情報
導入されたバージョン 3.2.0
コード修正の有無 はい(3.7.0 以降)

原因

メソッドは [ExpectedException] 属性でマークされています。

規則の説明

[ExpectedException] 属性より、Assert.ThrowsException 属性または Assert.ThrowsExceptionAsync 属性 (または MSTest 3.8 以上を使用している場合は、Assert.ThrowsExactly/Assert.Throws または Assert.ThrowsExactlyAsync/Assert.ThrowsAsync) を優先するします。これにより、テストの本文全体に対してではなく、予想されるコード行のみが予期される例外をスローするようになります。 また、アサート API はより柔軟であり、例外の追加のプロパティをアサートすることもできます。

[TestClass]
public class TestClass
{
    [TestMethod]
    [ExpectedException(typeof(InvalidOperationException))] // Violation
    public void TestMethod()
    {
        // Arrange
        var person = new Person
        {
            FirstName = "John", 
            LastName = "Doe",
        };
        person.SetAge(-1);

        // Act
        person.GrowOlder();
    }
}

違反の修正方法

[ExpectedException] 属性の使用を Assert.ThrowsException または Assert.ThrowsExceptionAsync の呼び出し (または MSTest 3.8 以降を使用している場合は、Assert.ThrowsExactly/Assert.Throws または Assert.ThrowsExactlyAsync/Assert.ThrowsAsync) で置き換えます。

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
        // Arrange
        var person = new Person
        {
            FirstName = "John", 
            LastName = "Doe",
        };
        person.SetAge(-1);

        // Act
        Assert.ThrowsExactly(() => person.GrowOlder());
    }
}

どのようなときに警告を抑制するか

メソッドがワンライナーの場合は、この診断を抑制しても問題ありません。

[TestClass]
public class TestClass
{
    [TestMethod]
    [ExpectedException(typeof(ArgumentNullException))]
    public void TestMethod()
    {
        new Person(null);
    }
}

警告を抑制する

単一の違反を抑制するだけの場合は、プリプロセッサ ディレクティブをソース ファイルに追加して無効にしてから、ルールを再度有効にします。

#pragma warning disable MSTEST0006
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0006

ファイル、フォルダー、またはプロジェクトのルールを無効にするには、その重大度を 構成ファイルnone に設定します。

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0006.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。