Question

J'essaie le cadre MOQ et je rencontre maintenant une barrière. Le test unitaire suivant échoue car la valeur réelle de la propriété ViewName est une chaîne vide.

Quelqu'un pourrait-il m'indiquer la bonne direction pour expliquer pourquoi cela ne passe pas le test?

[TestMethod]
public void Can_Navigate_To_About_Page()
{
    var request = new Mock<HttpRequestBase>();
    request.Setup(r => r.HttpMethod).Returns("GET");
    var mockHttpContext = new Mock<HttpContextBase>();
    mockHttpContext.Setup(c => c.Request).Returns(request.Object);

    var controllerContext = new ControllerContext(mockHttpContext.Object, 
                                new RouteData(), 
                                new Mock<ControllerBase>().Object);
    var controller = new HomeController();

    controller.ControllerContext = controllerContext;
    var result = controller.About() as ViewResult;

    Assert.AreEqual("About", result.ViewName);
}

Ce qui suit donne également un nom de vue vide.

        HomeController controller = new HomeController();
        ViewResult result = controller.About() as ViewResult;
        Assert.IsNotNull(result);
        Assert.AreEqual("About", result.ViewName);

À partir d’exemples sur le Web qui démontrent de la moquerie et un bon TTD, je suis confus quant aux autres éléments de plomberie dont j’ai besoin pour que l’un ou l’autre des exemples de tests unitaires ci-dessus fonctionne.

A bientôt,

Andrew

Était-ce utile?

La solution

Si le test échoue, c'est parce que ce qui décide du ViewName lorsque vous n'en spécifiez pas explicitement est dans les profondeurs de la structure. Plus précisément dans le moteur de vue, je crois. Donc, pour tester cela tel qu’il se présente, vous devrez vous moquer beaucoup plus du pipeline de demandes.

Ce que je fais, et recommande, est de ne pas compter sur les valeurs par défaut et de spécifier explicitement la vue:

return View("About");

Ensuite, la valeur sera là pour tester sans vous moquer de rien:

var controller = new HomeController();
var result = controller.About() as ViewResult;
Assert.AreEqual("About", result.ViewName);

Autres conseils

Cela est dû au fait que vous formulez des hypothèses sur le fonctionnement du framework MVC. Si vous utilisez les conventions pour localiser la vue, le framework laisse en fait la propriété ViewName sous la forme String.Empty jusqu'à ce que ExecuteResult () soit appelé.

Vous pouvez voir ce code à la ligne 68 de ViewResultBase.ExecuteResult dans la source MVC :

if (String.IsNullOrEmpty(ViewName)) {
   ViewName = context.RouteData.GetRequiredString("action");
}

En outre, vous devez faire attention à ce que vous testez. En règle générale, vous devez vous concentrer sur le test du code que vous écrivez , et non du code de la structure. Tester pour s'assurer que le nom de la vue par convention est correctement résolu est vraiment un test unitaire pour le framework lui-même, pas une application construite sur celui-ci.

Si vous recherchez un bon moyen de vous moquer de MVC, vous pouvez tester vos itinéraires (ce qui ressemble à ce que vous essayez de faire ici). Vous pouvez trouver un message de Phil Haack. concernant uniquement ce sujet pour vous aider à démarrer.

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