System.TypeInitializationException

Я пишу тесты для проверки форм Infopath для открытия в управлении формами, мой метод тестирования такой:

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

Я написал вспомогательный класс как

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

Но каждый раз, когда я выполняю этот код, это дает мне:

Метод тестирования InfoPathTest.TestAPI.Validate_OpenInfopathInFormControl выдал исключение: System.TypeInitializationException: Инициализатор типа для InfoPathTest.Helpers.Helper выдал исключение. ---> System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта..

Когда я пытаюсь выполнить отладку, происходит сбой, когда необходимо инициализировать вспомогательный класс. Это действительно съедает мою голову, есть ли какое-нибудь решение для этого?

Вот полный вспомогательный класс:

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

person sam_33    schedule 20.08.2010    source источник
comment
Не могли бы вставить вспомогательный класс с конструктором и переменными?   -  person Claudio Redi    schedule 21.08.2010
comment
Вам нужно будет показать нам, какой код находится в статическом конструкторе для вашего класса Helper (public static Helper()), поскольку что-то там вызывает исключение   -  person Rob    schedule 21.08.2010
comment
я обновил выше. Нет статического конструктора   -  person sam_33    schedule 21.08.2010
comment
бросить бывшего? Просто бросайте;   -  person ganders    schedule 25.04.2014
comment
Это может быть результатом плохого состояния среды выполнения Visual Studio; попробуйте закрыть его и снова открыть.   -  person Grault    schedule 04.06.2015


Ответы (3)


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

private static MainForm f =  new MainForm();

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

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

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

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

person Rob    schedule 20.08.2010
comment
Спасибо, да, вы правы. Есть проблема в конструкторе для MainForm, и я работаю в нем! - person sam_33; 21.08.2010

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

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

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

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

person LukeH    schedule 20.08.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
    }
}
person Johannes Rudolph    schedule 20.08.2010
comment
Я знал, что это произойдет :-) Начал расширяться до того, как увидел этот комментарий. Надеюсь, это прояснит ситуацию. - person Johannes Rudolph; 21.08.2010