2009-08-12 92 views
0

玩具示例代碼:測試類構造函數在單獨運行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屬性。

任何想法爲什麼發生這種事/我做錯了什麼?

+0

聲明:請勿使用xUnit.net。你有沒有嘗試把Console.WriteLine/trace語句放在ctors中?你確定ctor沒有被調用..因爲我沒有看到它如何在沒有創建測試夾具/類的實例的情況下運行測試。聽起來像一個錯誤,如果運行所有測試/運行一個測試結果在不同的測試輸出。嘗試:如果ctors被擊中,請嘗試使用僞值而不是返回靜態方法?測試是否在xUnit.net中的不同AppDomain中運行 – Gishu 2009-08-14 05:22:25

+0

將Console.WriteLine語句放在顯示測試作爲整個類的一部分運行時執行的構造函數。但是單獨調試(在Writeline語句中有一個斷點),我在調試器中遇到的第一件事是引發NullReference,而不是斷點。 – BenA 2009-08-14 08:56:56

+0

這可能是因爲您的靜態MyTestData方法在測試運行出於某種原因之前被調用 - 因爲您不必構造對象來調用靜態方法。這個測試夾具設計讓我有點不舒服 - 靜態方法取決於基類ctor以便正確運行。 PropertyData方法是否可以作爲實例方法 - 嘗試將基類ctor的設置代碼暫時移到靜態方法中,以確認是否是原因。 – Gishu 2009-08-14 10:10:11

回答

1

我們試圖用xUnit.net 1.5 Beta來重現這一點,但不能。

+0

經過對CodePlex的進一步討論(http://xunit.codeplex.com/Thread/View.aspx?ThreadId=65564)之後,我只需要根據執行順序重構測試。 – BenA 2009-08-17 08:19:14

相關問題