У меня есть пример веб-приложения 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
.