System.TypeInitializationException

5

我正在编写测试来测试Infopath表单在表单控件中打开,我的测试方法如下:

[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:未将对象引用设置为对象的实例。

当我尝试进行调试时,在需要初始化Helper类时失败。这真的让我很头疼,有没有解决办法?
以下是完整的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();
        }
    }
}

能否粘贴带有构造函数和变量的辅助类? - Claudio Redi
你需要向我们展示 public static Helper() 静态构造函数中的代码,因为异常是由其中某些内容引起的。 - Rob
我已经更新了上面的内容。没有静态构造函数。 - sam_33
1
抛出异常 ex?只需执行“throw;” - ganders
这可能是由于 Visual Studio 运行时状态不良引起的;尝试关闭并重新打开它。 - Grault
3个回答

6

您的测试调用了Helper.OpenForm(),由于没有静态构造函数,我唯一能看到可能引起异常的是:

private static MainForm f =  new MainForm();

因此,MainForm的构造函数中可能会抛出异常。在MainForm构造函数的第一行上设置断点,并逐步执行,直到找到抛出异常的位置。
或者,您可以编写一个新的测试用例,直接调用new MainForm(),以便更容易地确定问题所在,至少在最初阶段是这样。
[TestMethod]
public void Validate_OpenInfopathInFormControl()
{
    var form = new MainForm();
}

在测试的唯一一行上设置断点,并步入构造函数,以确定为什么会抛出NullReferenceException


谢谢,是的你说得对。MainForm的构造函数有问题,我正在处理! - sam_33

3
类型初始化器在这种情况下是你的静态字段初始化的地方;也就是说,这两行代码:
private static MainForm f =  new MainForm();
private static bool _isOpen = false;

bool的初始化不会引发任何异常,因此出现错误的源头很可能是在MainForm构造函数中。

TypeInitializationException对象是否包含任何内部异常?如果有,它们应该会提供更多关于实际错误原因的信息。


2

您的静态构造函数中存在错误(它们被称为类型初始化器)。内部异常是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
    }
}

我知道这一天会来的 :-) 在看到那条评论之前就开始扩展了。希望它能澄清事情。 - Johannes Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接