Вопрос

У меня есть образец веб-приложения ASP.NET MVC 3, которое следует за тестовым приводом Джонатана МакКракена ASP.NET MVC (кстати, отличная книга), и я наткнулся на проблему. Обратите внимание, что я использую MVCContrib, Rhino и NUNIT.

    [Test]
    public void ShouldSetLoggedInUserToViewBag() {
        var todoController = new TodoController();
        var builder = new TestControllerBuilder();
        builder.InitializeController(todoController);

        builder.HttpContext.User = new GenericPrincipal(new GenericIdentity("John Doe"), null);

        Assert.That(todoController.Index().AssertViewRendered().ViewData["UserName"], Is.EqualTo("John Doe"));
    }

Приведенный выше код всегда бросает эту ошибку:

System.accessviolationException: попытка прочитать или написать защищенную память. Это часто указывает на то, что другая память коррумпирована.

Код действия контроллера является следующим:

[HttpGet]
    public ActionResult Index() {
        ViewData.Model = Todo.ThingsToBeDone;
        ViewBag.UserName = HttpContext.User.Identity.Name;

        return View();
    }

Из того, что я выяснил, приложение, кажется, сбой из -за двух назначений в действии контроллера. Однако я не вижу, как есть неправильно!?

Может ли кто -нибудь помочь мне определить решение этой проблемы.

Спасибо.

Редактировать 1

Я прошел некоторые эксперименты, чтобы увидеть, в чем проблема. При удалении ViewData,Model Присвоение Проблема выходит в Expected result to be of type ViewResult. It is actually of type ViewResult.. Анкет А ViewData Задание настолько простым, что я не думаю, что это проблема, поэтому я думаю, что что -то не так с носорогом или MVCContrib в сочетании с MVC 3.

У меня также есть следующий тест, написанный ранее для того же действия контроллера:

        [Test]
    public void ShouldDisplayAListOfTodoItems() {
        Assert.That(((ViewResult)new TodoController().Index()).ViewData.Model, Is.EqualTo(Todo.ThingsToBeDone));
    }

Этот терпит неудачу сейчас с System.NullReferenceException : Object reference not set to an instance of an object Вероятно, потому что для этого конкретного теста нет HTTPContext. При удалении ViewBag Задание, все в порядке.

Надеюсь, что это делает проблему более ясной.

Редактировать 2

При отладке кода после удаления ViewData.Model Назначение, это вызывает другую ошибку: System.NullReferenceException : Object reference not set to an instance of an object. на ViewBag назначение.

Это было полезно?

Решение

Ну, я сбил это. Как я подозревал, это было из -за MVCContrib. Нам, что я использую бета -версию MVC 3, которая еще официально не поддерживается MVCContrib. Имея это в виду, я загрузил последние источники MVCContrib для MVC 3 Branch.

Перейти к Источники MVCContrib, переключиться на MVC3 ветвь, скачать и построить двоичные файлы с прикрепленной летучей мышью. Затем включите необходимые файлы в свое решение.

Ну, это, вероятно, будет исправлено в будущем стабильном выпуске, но я думаю, что это может быть полезно для других. Спасибо, Дарин, за ваш интерес.

Другие советы

Как насчет этого:

[Test]
public void ShouldSetLoggedInUserToViewBag() 
{
    // arrange
    var todoController = new TodoController();
    var builder = new TestControllerBuilder();
    builder.InitializeController(todoController);

    builder.HttpContext
        .Stub(x => x.User)
        .Return(new GenericPrincipal(new GenericIdentity("John Doe"), null));

    // act
    var actual = todoController.Index();

    // assert
    actual.AssertViewRendered();
    Assert.That(todoController.ViewData["UserName"], Is.EqualTo("John Doe"));
}

и действие контроллера:

[HttpGet]
public ActionResult Index() 
{
    ViewBag.UserName = HttpContext.User.Identity.Name;
    return View(Todo.ThingsToBeDone);
}

Замечание: я бы включил информацию в модель просмотра и избегал использования ViewData/ViewBag. Анкет Это не сильно напечатано и заставляет вас использовать магические цитаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top