共用方式為


MSTEST0006:避免 [ExpectedException]

屬性
規則識別碼 MSTEST0006
標題 避免 [ExpectedException]
類別 設計
修正程式是中斷或非中斷 不中斷
預設為啟用 Yes
預設嚴重性 資訊
在版本中引進 3.2.0
是否有程式修正 是,從 3.7.0 開始

原因

會以 [ExpectedException] 屬性標記方法。

檔案描述

建議使用 Assert.ThrowsExceptionAssert.ThrowsExceptionAsync(或者在使用 MSTest 3.8 和更高版本時使用 Assert.ThrowsExactly/Assert.ThrowsAssert.ThrowsExactlyAsync/Assert.ThrowsAsync),而不是 [ExpectedException] 屬性,這樣可以確保只有預期的程式碼行會拋出預期的異常,而不是影響整個測試主體。 判斷提示 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();
    }
}

如何修正違規

使用 MSTest 3.8 和更新版本時,呼叫 [ExpectedException]Assert.ThrowsExceptionAssert.ThrowsExceptionAsyncAssert.ThrowsExactly/ 或 Assert.ThrowsAssert.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

如需詳細資訊,請參閱 如何抑制程式代碼分析警告