System.TypeInitializationException

我正在编写测试来测试Infopath Forms在Form Control中打开,我的测试方法是

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

我写了助手课

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

但每次我执行此代码时,这都给了我:

测试方法InfoPathTest.TestAPI.Validate_OpenInfopathInFormControl抛出exception:System.TypeInitializationException:’InfoPathTest.Helpers.Helper’的类型初始值设定项引发exception。 —> 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(); } } } 

你的测试调用Helper.OpenForm() ,因为你没有静态构造函数,我唯一能看到的会导致抛出exception的是:

 private static MainForm f = new MainForm(); 

因此,MainForm的构造函数中的某些内容可能会引发exception。 在MainForm的构造函数的第一行放置一个断点,然后逐步执行,直到看到抛出exception的位置。

或者,您可能会发现更容易确定问题所在,至少在最初阶段,通过编写一个新的测试,您可以直接调用new MainForm()

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

在测试的唯一一行放置断点并进入构造函数以确定它为什么抛出NullReferenceException

在这种情况下,类型初始化器是初始化静态字段的位置; 也就是说,这两行:

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

bool的初始化不会导致任何类型的exception,因此错误的来源很可能是在MainForm构造函数中。

TypeInitializationException对象是否包含任何内部exception? 如果是这样,他们应该给你更多关于错误的真正原因的信息。

您的静态构造函数中有一个错误(它们被称为类型初始化程序)。 内部exception是NullReferenceexception。 如果您发布代码,我们可能会帮助您。

规则确定何时运行类型初始化程序很复杂,但保证在以任何方式访问类型之前运行它们。 您可能没有直接明白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 } }