2010-07-30 10 views
3

J'ai récemment fait un refactoring de mon application mvc et j'ai réalisé qu'il y avait beaucoup de vues statiques retournées. Au lieu d'avoir plusieurs contrôleurs avec des résultats d'action qui ne retournent qu'une vue, j'ai décidé de créer un contrôleur qui retourne les vues statiques si elles existent et renvoie une erreur 404 si la vue n'existe pas.Quelle est la bonne façon de tester UnitEngines.Engines.FindView?

public ActionResult Index(string name) 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 

    if (result.View == null) 
     ThrowNotFound("Page does not exists."); 

    return View(name); 
} 

Ma question est quelle est la bonne façon de tester ces unités? J'ai essayé le code suivant mais l'erreur que je reçois est "Le RouteData doit contenir un élément nommé 'controller' avec une valeur de chaîne non vide". Mon intention était pour le test unitaire de sortir et d'aller chercher la vue réelle. Puis j'ai commencé à me demander si je devais mocker les ViewEngines avec SetupGet pour FindView et créer deux tests, où le second teste que l'exception non trouvée est levée si la vue est nulle.

Quelle est la bonne façon de tester cette fonctionnalité? Des pointeurs, des exemples de code ou des articles de blog seraient utiles.

Merci

Répondre

4

Vous devez créer un moteur de vue moquée et le mettre dans la collection:

[Theory] 
[InlineData("ContactUs")] 
public void Index_should_return_view_if_view_exists(string name) 
{ 
    var mockViewEngine = MockRepository.GenerateStub<IViewEngine>(); 
    // Depending on what result you expect you could set the searched locations 
    // and the view if you want it to be found 
    var result = new ViewEngineResult(new [] { "location1", "location2" }); 
    // Stub the FindView method 
    mockViewEngine 
     .Stub(x => x.FindView(null, null, null, false)) 
     .IgnoreArguments() 
     .Return(result); 
    // Use the mocked view engine instead of WebForms 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(mockViewEngine); 

    controller = new ContentController(); 

    var actual = (ViewResult)controller.Index(name); 

    Assert.NotNull(actual.View); 
} 
+0

Darin, merci! Pouvez-vous clarifier les "locations1", "locations2"? Supposons que ma vue est dans ~ Views/Content/ContactUs.aspx et je voudrais que le test ci-dessus le trouve. Comment est-ce que je configurerais ViewEngineResult en conséquence? – Thomas

+0

Peu importe où votre vue est. Dans un projet de test unitaire, il n'y a pas de vue. C'est le point de se moquer du moteur de vue. 'location1' et' location2' sont juste pour rendre le compilateur heureux. Pas utilisé du tout. Vous pouvez y mettre une collection de chaînes vides. Mais dans le monde réel, ils représentent les emplacements que votre moteur de vue a essayés pour rechercher la vue. –

+0

Donc, dans votre exemple, result.View est nul, donc lorsque le test s'exécute, la vue ne sera pas trouvée. Comment pourrais-je tester le contraire? Je veux tester si la vue a été trouvée. – Thomas

Questions connexes