2010-08-20 25 views
5

我寫測試,以測試InfoPath表單中表單控件打開,我的測試方法是System.TypeInitializationException

[TestMethod] 
public void Validate_OpenInfopathInFormControl() 
{ 
    Helper.OpenForm(); 
    //Other Code  
} 

我寫Helper類爲

public class Helper 
{ 
    public static void OpenForm() 
    { 
     //Code to Open Form 
    } 
} 

但每次我執行此代碼,這給了我:

試驗方法 InfoPathTest.TestAPI.Validate_OpenInfopathInFormCont rol 引發異常: System.TypeInitializationException: 'InfoPathTest.Helpers.Helper'的類型初始值設定項引發了 異常。 ---> System.NullReferenceException:對象 引用未設置爲一個 對象的實例..

當我嘗試調試,當Helper類需要初始化失敗。這真的是在吃我的頭,有沒有解決方法?

下面是完整的輔助類:

namespace InfoPathTest.Helpers 
{ 
    public class Helper 
    { 
    //This is the form i need to OPEN 
     private static MainForm f = new MainForm(); 
     private static bool _isOpen = false; 

     public static bool isOpen 
     { 
      set { _isOpen = value; } 
      get { return _isOpen; } 
     } 

     public static void OpenForm() 
     { 
      try 
      { 
       f.Show(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      _isOpen = true; 

     } 

     public static void CloseForm() 
     { 
      f.Hide(); 
     } 
    } 
} 
+0

可以將輔助類與構造函數和變量一起粘貼嗎? – 2010-08-20 22:34:30

+0

您必須向我們展示您的Helper類('public static Helper()')的靜態構造函數中的代碼,因爲它在那裏導致我上面已更新的異常 – Rob 2010-08-20 22:35:30

+0

。沒有靜態構造函數 – 2010-08-20 22:38:52

回答

6

你的測試呼叫Helper.OpenForm()和你沒有靜態構造函數中,我唯一能看到這將導致引發異常是:

private static MainForm f = new MainForm(); 

因此一些在構造函數中的MainForm很可能拋出異常。在MainForm構造函數的第一行行上放置一個斷點,然後逐步瀏覽,直到看到引發異常的位置。

另外,你可能會發現更容易確定是什麼問題,至少在最初階段,通過寫一個新的測試,你可以通過一步直接調用new MainForm()

[TestMethod] 
public void Validate_OpenInfopathInFormControl() 
{ 
    var form = new MainForm(); 
} 

將斷點上只有一行測試並進入構造函數以確定它爲什麼拋出NullReferenceException

+0

謝謝,是的,你是對的。 MainForm的構造函數有一個問題,我正在使用它! – 2010-08-20 22:48:20

1

您的靜態構造函數的錯誤(他們被稱爲類型初始化器)。內部異常是一個NullReference異常。如果你發佈你的代碼,我們可能會幫助你。

規則確定何時運行類型初始值設定項很複雜,但可以保證它們在以任何方式訪問該類型之前運行。它可能不是直接明顯,你,你有你的Helper類的類型初始化,因爲你可能會使用隱式初始化:

public class Helper 
{ 
    static int i = 10; // This assignment will end up in a type initializer 
    static Helper() 
    { 
     // Explicit type initializer 
     // The compiler will make sure both, implicit and explicit initializations are run 
    } 
} 
+0

我已經更新上面。在靜態構造函數中沒有代碼 – 2010-08-20 22:39:37

+0

我知道這是未來:-)在我看到該評論之前開始擴展。希望它清除一切。 – 2010-08-20 22:42:53

3

類型初始化程序,在這種情況下,您的靜態字段被初始化;也就是說,這兩條線:

private static MainForm f = new MainForm(); 
private static bool _isOpen = false; 

一個bool的初始化是不會造成什麼樣的異常,所以它很有可能是錯誤的來源是MainForm構造。

TypeInitializationException對象是否包含任何內部異常?如果是這樣,他們應該給你更多關於錯誤真正原因的信息。

相關問題