| 屬性 | 值 |
|---|---|
| 規則識別碼 | MSTEST0010 |
| 標題 | ClassInitialize 方法應具有有效的版面配置 |
| 類別 | 使用 |
| 修正是破壞性或非破壞性 | 不中斷 |
| 預設為啟用 | 是 |
| 預設嚴重性層級 | 警告 |
| 於版本中引入 | 3.3.0 |
| 是否有程式碼修正 | 是 |
原因
標記為 [ClassInitialize] 的方法應該具有有效版面配置。
規則描述
MSTest 呼叫 [ClassInitialize] 來準備由測試類別共享的資源,而非單一測試類別實例的狀態:
| Requirement | Reason |
|---|---|
其方法為 public。 |
公開方法則是 MSTest 生命週期發現契約中的一部分。
[DiscoverInternals] 允許內部宣告類別,而非 internal 生命週期方法。 |
此方法為 static。 |
類別初始化屬於類別的共享生命週期,而非為其測試所建立的任何一個實例。 |
這個方法很普通,既不 abstract 也不是泛型。 |
MSTest 需要一個能在沒有特殊調用規則或方法類型參數的情況下調用的方法實作。 |
此方法恰好接受一個 TestContext 參數。 |
MSTest 直接傳遞類別初始化內容,因為沒有任何每次測試的執行個體可將其提供給此靜態回呼。 |
回傳型別為 void、 Task或 ValueTask,且方法不是 async void。 |
MSTest 必須等待非同步初始化並觀察其失敗,然後才會執行依賴共享資源的測試。 |
宣告類別為抽象或泛型,並指定 InheritanceBehavior.BeforeEachDerivedClass。 |
這樣的基底類別本身不會作為具體測試類別執行。 繼承設定將其初始化與執行測試的具體衍生類別關聯起來。 |
密封宣告類別未指定 InheritanceBehavior.BeforeEachDerivedClass。 |
封閉的類別不能有衍生類別,因此繼承設定沒有適用範圍可套用。 |
宣告型別提供擁有以下回呼的測試固定裝置:
- 使用 一個
class,讓 MSTest 能將回撥與測試類別階層關聯起來。 - 使用
public類別,或具有[assembly: DiscoverInternals]的internal類別,以符合 MSTest 的類型探索合約。 - 請對這些測試夾具使用非靜態類別。 測試方法需要一個測試類別實例,即使類別層級的生命週期回調是靜態的。
- 使用
[TestClass]或衍生屬性來標記密封類別。 封閉類別無法將繼承的回調提供給其他測試類別,因此必須以測試容器身份識別自己。
如何修正違規
請確定方法符合上述的配置。
何時抑制警告
請勿隱藏此規則的警告。 如果忽略此規則,則將會跳過加上旗標的執行個體或導致在執行階段時發生錯誤。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable MSTEST0010
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0010
若要停用檔案、資料夾或項目的規則,請將其嚴重性設定為 組態檔中的 none。
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0010.severity = none
如需詳細資訊,請參閱 如何抑制程式代碼分析警告。