Попытка прочитать или написать защищенную память
-
14-10-2019 - |
Вопрос
У меня есть образец веб-приложения 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
. Анкет Это не сильно напечатано и заставляет вас использовать магические цитаты.