我正在编写测试以测试Infopath Forms在Form Control中打开,我的测试方法是
[TestMethod]
public void Validate_OpenInfopathInFormControl()
{
Helper.OpenForm();
//Other Code
}
我写过Helper类
public class Helper
{
public static void OpenForm()
{
//Code to Open Form
}
}
但每次执行此代码时,都会给我:
测试方法 InfoPathTest.TestAPI.Validate_OpenInfopathInFormControl 抛出异常: System.TypeInitializationException: 类型初始值设定项 'InfoPathTest.Helpers.Helper'扔了一个 例外。 ---> System.NullReferenceException:Object 引用未设置为的实例 对象..
当我尝试调试时,当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 :(得分:6)
您的测试调用Helper.OpenForm()
并且由于您没有静态构造函数,我唯一可以看到会导致抛出异常的是:
private static MainForm f = new MainForm();
因此,MainForm的构造函数中的某些内容可能会引发异常。在MainForm的构造函数的 first 行上放置一个断点,然后逐步执行,直到看到抛出异常的位置。
另外,您可能会发现更容易确定问题所在,至少在最初阶段,通过编写新测试,您可以直接执行调用new MainForm()
:
[TestMethod]
public void Validate_OpenInfopathInFormControl()
{
var form = new MainForm();
}
在测试的唯一一行放置断点并进入构造函数以确定它为什么抛出NullReferenceException
。
答案 1 :(得分:3)
在这种情况下,类型初始化器是初始化静态字段的位置;也就是说,这两行:
private static MainForm f = new MainForm();
private static bool _isOpen = false;
bool
的初始化不会导致任何类型的异常,因此错误的来源极有可能在MainForm
构造函数中。
TypeInitializationException
对象是否包含任何内部异常?如果是这样,他们应该给你更多关于错误的真正原因的信息。
答案 2 :(得分:2)
静态构造函数中有一个错误(它们被称为Type Initializers)。内部异常是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
}
}