System.TypeInitializationException - PullRequest
       4

System.TypeInitializationException

5 голосов
/ 21 августа 2010

Я пишу тесты для тестирования форм 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.Это действительно съедает мою голову, есть ли какое-то решение для этого?

Вот полный класс помощника:

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();
        }
    }
}

Ответы [ 3 ]

6 голосов
/ 21 августа 2010

Ваш тест вызывает Helper.OpenForm(), и поскольку у вас нет статического конструктора, единственное, что я вижу, что вызовет исключение, это:

private static MainForm f =  new MainForm();

Поэтому что-то в конструкторе для MainForm, вероятно, вызывает исключение. Поместите точку останова в строку first конструктора для MainForm и переходите по ней, пока не увидите, куда выдается исключение.

В качестве альтернативы вам может быть проще определить, в чем заключается проблема, по крайней мере на начальном этапе, написав новый тест, который вы можете выполнить, вызывая new MainForm() напрямую:

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

Поместите точку останова на единственную строку теста и войдите в конструктор, чтобы определить, почему он вызывает NullReferenceException.

3 голосов
/ 21 августа 2010

В этом случае инициализатор типа - это место, где инициализируются ваши статические поля; То есть эти две строки:

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

Инициализация bool не вызовет каких-либо исключений, поэтому весьма вероятно, что источник ошибки находится в конструкторе MainForm.

Содержит ли объект TypeInitializationException какие-либо внутренние исключения? Если это так, они должны дать вам больше информации о реальной причине ошибки.

2 голосов
/ 21 августа 2010

В статическом конструкторе есть ошибка (они называются инициализаторами типов).Внутреннее исключение является исключением 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
    }
}
...