1

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

4

2 に答える 2

5

さて、私はこれをノックダウンしました。私が疑ったように、それはMVCContribのせいでした。MVCContribによってまだ正式にサポートされていないMVC3ベータ版を使用していることに注意してください。そのことを念頭に置いて、MVC3ブランチ用の最新のMVCContribソースをダウンロードしました。

MVCContrib Sourcesに移動し、 mvc3ブランチに切り替えてダウンロードし、付属のバットを使用してバイナリをビルドします。次に、必要なファイルをソリューションに含めます。

まあ、これはおそらく将来の安定したリリースで修正されるでしょうが、私はそれが他の人に役立つかもしれないと思います。興味を持ってくれてありがとうダリン。

于 2011-01-02T21:30:45.060 に答える
1

これはどう:

[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ます。強く型付けされていないため、魔法の引用符を使用する必要があります。

于 2011-01-02T08:51:06.593 に答える