JonathanMcCrackenのTest-DriveAsp.NETMVC(ちなみに素晴らしい本)に続くサンプルASP.NET MVC 3 Webアプリケーションがあり、問題に遭遇しました。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();
}
私が理解したところによると、コントローラーアクションに2つの割り当てがあるため、アプリがクラッシュしているようです。しかし、どうして間違っているのかわかりません!?
誰かが私がこの問題の解決策を特定するのを手伝ってくれますか?
ありがとうございました。
編集1
私は問題が何であるかを見るためにいくつかの実験をしました。ViewData,Model
割り当てを削除すると、問題はで超越しExpected result to be of type ViewResult. It is actually of type ViewResult.
ます。割り当ては非常に基本的であるため、ViewData
問題とは思わないので、MVC3と組み合わせたRhinoまたはMVCcontribのいずれかに問題があると思います。
同じコントローラーアクションについて、以前に作成した次のテストもあります。
[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
。