2012-07-19 27 views
6

ClassInitialize似乎每次測試都會被調用。我想這是因爲一個新班級實際上是爲每個考試創建的。MSTest ClassInitialize整個類的一次

爲什麼?其他每個框架都不會這樣做!

反正......我需要在這個類上執行一個方法(不是靜態的)。我還需要在類的同一個實例中執行所有的測試方法。

我在沒有槳的小溪嗎?

+0

某些原因你不能只打一個電話,然後打另一個電話? – Wug 2012-07-19 18:04:13

+1

所有在一個測試?我可以做到這一點,但是我不能立即看到哪些測試失敗。一個測試稱爲「AllTests」? – 2012-07-19 20:50:05

回答

15

ClassInitialize在調用任何TestMethod之前被MSTest調用一次,請參見備註here。在每種測試方法之前調用一次TestInitialize。 MSTest爲每個TestMethod調用創建一個測試類的新實例。這就是爲什麼ClassInitialize是一個靜態方法。

我需要在類上執行一個方法(不是靜態的)。我還需要在類的同一個實例中執行所有的測試方法。

你的意思是你需要在TestClass或被測試的類(你正在測試的類)上執行一個方法嗎?

無論哪種情況,您都可以在TestClass中擁有一個靜態成員,並在ClassInitialize中初始化一次。它只會被創建一次並存在於您的測試的整個生命週期中。您只能在其上調用一次方法。然後,您可以在每種測試方法中使用這個單一實例。

有一點需要注意的是,MSTest可能會交錯來自不同類別的測試。所以,如果你有任何可以從多個ClassInitialize(或測試這個問題)訪問的全局可變狀態,可能會發生不可預測的事情。出於這個原因,最好避免靜力學。

要求所有方法必須在同一個實例上執行是非常不尋常的。也許有一種方法來重構你的代碼來消除這個約束?