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 } }