玩具示例代碼:測試類構造函數在單獨運行xUnit理論時不執行?
public abstract class testBase
{
public testBase()
{
//Some common test setup code, which will initialize ManagerClass
}
}
public class someTests: testBase
{
public someTests()
{
//someTests-specific constructor code.
}
[Theory]
[PropertyData("MyTestData")]
public void test1(Foo foo)
{
//Use foo to do a test
}
public static IEnumerable<object[]> MyTestData
{
get
{
yield return new object[] { ManagerClass.CreateANewFoo(1) };
yield return new object[] { ManagerClass.CreateANewFoo(42) };
}
}
}
在上面的例子,如果我專門跑TEST1(我使用ReSharper的,但是當我使用的xUnit GUI也出現問題)我的測試失敗,因爲它似乎testBase和someTests構造函數都不會被執行。因此,調用ManagerClass.CreateANewFoo()會拋出一個NullReference。
如果我在someTests或任何其他單獨測試中運行所有測試,則構造函數按預期執行,並且測試按預期方式進行。將test1標記爲不同的唯一事實是它正在使用PropertyData屬性。
任何想法爲什麼發生這種事/我做錯了什麼?
聲明:請勿使用xUnit.net。你有沒有嘗試把Console.WriteLine/trace語句放在ctors中?你確定ctor沒有被調用..因爲我沒有看到它如何在沒有創建測試夾具/類的實例的情況下運行測試。聽起來像一個錯誤,如果運行所有測試/運行一個測試結果在不同的測試輸出。嘗試:如果ctors被擊中,請嘗試使用僞值而不是返回靜態方法?測試是否在xUnit.net中的不同AppDomain中運行 – Gishu 2009-08-14 05:22:25
將Console.WriteLine語句放在顯示測試作爲整個類的一部分運行時執行的構造函數。但是單獨調試(在Writeline語句中有一個斷點),我在調試器中遇到的第一件事是引發NullReference,而不是斷點。 – BenA 2009-08-14 08:56:56
這可能是因爲您的靜態MyTestData方法在測試運行出於某種原因之前被調用 - 因爲您不必構造對象來調用靜態方法。這個測試夾具設計讓我有點不舒服 - 靜態方法取決於基類ctor以便正確運行。 PropertyData方法是否可以作爲實例方法 - 嘗試將基類ctor的設置代碼暫時移到靜態方法中,以確認是否是原因。 – Gishu 2009-08-14 10:10:11