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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
.NET