Попытка чтения или записи в защищенную память - PullRequest
1 голос
/ 02 января 2011

У меня есть пример веб-приложения ASP.NET MVC 3, которое следует за Test-Drive 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 является настолько базовым, что я не думаю, что это проблема, поэтому я думаю, что что-то не так с Rhino или 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.

Ответы [ 2 ]

5 голосов
/ 03 января 2011

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

Перейдите на MVCContrib Sources , переключитесь на ветку mvc3 , загрузите и соберите двоичные файлы с помощью прикрепленной bat. Затем включите необходимые файлы в ваше решение.

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

1 голос
/ 02 января 2011

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

[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. Он не является строго типизированным и заставляет вас использовать магические кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...