Question

J'ai un exemple d'application Web ASP.NET MVC 3 qui suit Asp.NET Test-Drive Jonathan McCracken MVC (grand livre, en passant) et je suis tombé sur un problème. Notez que j'utilise MvcContrib, Rhino et 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"));
    }

Le code ci-dessus jette toujours cette erreur:

  

System.AccessViolationException: Tentative de lecture ou d'écriture de mémoire protégée. Cela est souvent une indication qu'une autre mémoire est corrompue.

Le code d'action de l'automate est la suivante:

[HttpGet]
    public ActionResult Index() {
        ViewData.Model = Todo.ThingsToBeDone;
        ViewBag.UserName = HttpContext.User.Identity.Name;

        return View();
    }

D'après ce que j'ai compris, l'application semble se bloquer en raison des deux assignements dans l'action du contrôleur. Cependant, je ne vois pas comment il y a de mal!

aide quelqu'un peut me repérer la solution à ce problème.

Merci.

Modifier 1

Je l'ai fait quelques expériences pour voir ce que le problème est. Lors de la suppression de la cession de ViewData,Model le problème transcende Expected result to be of type ViewResult. It is actually of type ViewResult.. L'affectation de ViewData est si fondamental que je ne pense pas que ce soit le problème, donc je pense qu'il ya quelque chose de mal avec soit Rhino ou MvcContrib conjointement avec MVC 3.

J'ai aussi le test suivant écrit plus tôt pour la même action du contrôleur:

        [Test]
    public void ShouldDisplayAListOfTodoItems() {
        Assert.That(((ViewResult)new TodoController().Index()).ViewData.Model, Is.EqualTo(Todo.ThingsToBeDone));
    }

Celui-ci échoue maintenant avec System.NullReferenceException : Object reference not set to an instance of an object probablement becuase il n'y a pas HttpContext mis en place pour ce test particulier. Lors de la suppression de l'affectation ViewBag, tout est ok.

L'espoir qui rend le problème plus clairement.

Edit 2

Lors du débogage du code après avoir supprimé l'attribution de ViewData.Model, il jette une autre erreur:. System.NullReferenceException : Object reference not set to an instance of an object. sur la cession de ViewBag

Était-ce utile?

La solution

Eh bien, je l'ai frappé celui-ci vers le bas. Comme je l'ai soupçonné, il était à cause de MvcContrib. L'esprit que j'utilise MVC 3 Beta qui n'a pas encore officiellement pris en charge par MvcContrib. Dans cet esprit, je l'ai téléchargé les dernières sources de MvcContrib pour la branche MVC 3.

Aller à MvcContrib Sources , passer à la MVC3 branche, télécharger et construire les binaires avec la chauve-souris attachée. Ensuite, inclure les fichiers nécessaires dans votre solution.

Eh bien, ce sera probablement se fixe dans un futur proche de stable, mais je suppose que cela pourrait être utile aux autres. Nous vous remercions de l'intérêt que Darin.

Autres conseils

Que diriez-vous ceci:

[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"));
}

et l'action du contrôleur:

[HttpGet]
public ActionResult Index() 
{
    ViewBag.UserName = HttpContext.User.Identity.Name;
    return View(Todo.ThingsToBeDone);
}

Remarque: j'inclure les informations dans le modèle de vue et éviter d'utiliser ViewData/ViewBag. Il n'est pas fortement typé et il vous oblige à utiliser les guillemets magiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top