T4MVC выдает исключение TypeInitializationException во время модульного теста - как это исправить? - PullRequest
2 голосов
/ 09 марта 2011

Я добавляю модульное тестирование в решение NerdDinner и столкнулся с этим.Я тестирую метод Edit POST, приведенный здесь:

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public virtual ActionResult Edit(int id, FormCollection formValues)
    {
        Dinner dinner = dinnerRepository.GetDinner( id );
        if (!dinner.IsHostedBy(User.Identity.Name))
        {
            return View(Views.InvalidOwner);
        }
        try
        {
            UpdateModel(dinner);
            dinnerRepository.Save();

            //return RedirectToAction("Details", new { id = dinner.DinnerID });
            return RedirectToAction(Actions.Details(dinner.DinnerID));
        }
        catch (Exception ex)
        {
            foreach (var issue in dinner.GetRuleViolations())
            {
                ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }
            return View(new DinnerFormViewModel(dinner));
        }
    }

Исключение System.TypeInitializationException выдается в строке «return RedirectToAction ...» и говорит: «Инициализатор типа для MVC» вызвал исключение. "

Когда я заменяю строку в кодировке T4MVC исходной строкой (закомментированной выше), я не получаю исключения.

Вот код модульного теста:

    [TestMethod]
    public void EditAction_Should_Redirect_When_Update_Successful()
    {
        // Arrange
        var controller = CreateDinnersControllerAs("Some User");
        var formValues = new FormCollection
                             {
                                 { "Title", "Another Value" },
                                 { "Description", "Another Description" }
                             };
        controller.ValueProvider = formValues.ToValueProvider();

        // Act
        var result = controller.Edit(1, formValues) as RedirectToRouteResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Details", result.RouteValues["Action"]);
    }

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

Идеи?

Дэйв

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

MVC - это класс, сгенерированный T4MVC. Ошибка, которую вы видите, просто означает, что исключение было сгенерировано внутри конструктора этого сгенерированного класса MVC (обратите внимание, что «конструктор» в этом смысле также означает инициализацию любых полей, которым назначено значение, где они объявлены).

Откройте и сохраните файл T4MVC.tt, чтобы обеспечить актуальность файла, сгенерированного кодом. Если это не помогает, и вы используете самую последнюю доступную версию, установите точку останова в конструкторе сгенерированного класса MVC, чтобы выяснить, что его нарушает.

0 голосов
/ 10 марта 2011

Для тех, кто может следовать за мной - использование T4MVC вводит взаимозависимости в процессе тестирования.По сути, T4MVC генерирует новые частичные классы для всех ваших контроллеров, и это может вызвать проблемы.В моем случае конструктор MVC пытался создать RSVPController, и, поскольку я еще этого не коснулся, он все еще пытался подключиться к базе данных.Я не уверен, как отделить отдельные контроллеры для модульного тестирования с T4MVC в миксе, поскольку это касается всего.Если у вас есть идеи, пожалуйста, дайте мне знать ...

Дейв

...