0

J'utilise MVC 2 avec les contribs MVC et Rhino.ASP.NET MVC 2: Ce qu'il faut tester dans les vues et les contrôleurs

J'ai besoin d'aide. Ce fut un week-end douloureux. J'ai essayé de trouver de bons articles sur comment faire des tests sur les contrôleurs en utilisant MVC contrib. Et personne n'a de réponses décentes pour moi. Je veux savoir ce que j'ai besoin de tester sur une vue et dans les contrôleurs? Est-ce que cet appareil est un test ou un test d'intégration? Permettez-moi de décrire mon scénario de base: J'ai une vue Index qui a une grille dessus. Dans cette grille, j'ai une liste de nouvelles. Dans cette grille, dans la dernière colonne de chaque ligne, se trouve un lien Modifier qui amène l'utilisateur à la vue EditNews pour modifier l'élément d'actualité sélectionné. Dans cette vue Index, il existe également un bouton Ajouter des nouvelles qui amène l'utilisateur à la vue CreateNews. Maintenant, étant donné le scénario actuel, quels tests dois-je écrire? Pourriez-vous, s'il vous plaît, indiquer s'il s'agit de tests unitaires ou de tests d'intégration. Ai-je besoin d'écrire un test pour le lien Modifier? Dois-je écrire un test pour le bouton Ajouter des nouvelles? Dois-je écrire un test pour vérifier si l'utilisateur est autorisé sur cette page d'index? Voilà ce que j'ai actuellement:

[Test] 
public void Index_Should_Redirect_To_Error_View_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Log_Exception_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Return_Default_View() 
{ 
    // Act 
    var result = newsController.Index(); 

    // Assert 
    result 
     .AssertViewRendered() 
     .ForView("Index"); 
} 

MISE À JOUR: Voici ma méthode d'action Index:

public ActionResult Index() 
{ 
    IEnumerable<News> news = newsRepository.FindAll(); 
    return View(news); 
} 

Tous les articles décents ou exemple de code serait apprécié. Aussi sur MVC contrib, les exemples de code ne sont pas très utiles. J'aimerais entendre autant d'opinions que possible.

Merci.

Répondre

1

Vous devez faire la distinction entre les tests unitaires, les tests d'intégration et les tests Web. Les tests unitaires permettent de tester différents composants de votre code, tels que les actions du régulateur isolément. Les tests d'intégration permettent de tester l'intégration entre votre code et des composants externes tels qu'un référentiel qui lit et écrit des données depuis une base de données et un test Web pour tester un scénario utilisateur complet de votre application tel que l'utilisateur tapant une adresse dans la barre d'adresse de son navigateur, en cliquant sur un bouton, ...

MVCContrib.TestHelper et Rhino Mocks sont destinés à simplifier vos tests unitaires. Donc, dans votre scénario, vous devriez tester votre action contrôleur Index. Sans montrer le code que cette action du contrôleur contient, il est difficile de dire exactement ce que vous devez tester. En général, ce que vous pourriez tester en unité dans une action du contrôleur est qu'il valide l'entrée, appelle les méthodes appropriées sur le référentiel et en fonction des résultats, il renvoie la vue correcte.

Alors supposons que vous avez l'action Index ci-dessous vous êtes prêt à tester:

public class HomeController: Controller 
{ 
    private readony INewRepository _repository; 
    public HomeController(INewRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var news = _repository.GetNews(); 
     return View(news); 
    } 
} 

et le test unitaire correspondant:

[TestClass] 
public class HomeControllerTests : TestControllerBuilder 
{ 
    private HomeController _sut; 
    private INewsRepository _repositoryStub; 

    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     _repositoryStub = MockRepository.GenerateStub<INewsRepository>(); 
     _sut = new UsersController(_repositoryStub); 
     InitializeController(_sut); 
    } 

    [TestMethod] 
    public void UsersController_Index_Should_Fetch_News_From_Repository() 
    { 
     // arrange 
     var news = new News[0]; 
     _repositoryStub.Stub(x => x.GetNews()).Return(news); 

     // act 
     var actual = _sut.Index(); 

     // assert 
     actual 
      .AssertViewRendered() 
      .WithViewData<News[]>() 
      .ShouldBe(news); 
    } 
} 

En ce qui concerne vos points de vue sont concernés, vous aurez besoin écrire des tests Web pour vérifier qu'ils se comportent comme prévu. Il existe différents outils qui peuvent vous aider ici tels que Selenium ou directement utiliser Web Tests si vous avez la version ultime de Visual Studio. Steven Sanderson également proposed an interesting approach pour tester les vues que vous pourriez jeter un coup d'oeil.

+0

Voir mise à jour. Je ne comprends toujours pas ça. Les tests que j'ai mentionnés ci-dessus, sont-ils dans la ligne jusqu'à présent? Quoi d'autre auriez-vous testé et testé? Si vous pouviez fournir quelques échantillons, j'apprécierais cela. –

+0

@Brendan, l'action 'Index' de votre contrôleur doit être testée à l'unité. Voir mon exemple de code pour cela. Cela ressemble beaucoup à ce que je vous ai montré. –

+0

Merci. Juste une autre question novice, ne faites-vous pas beaucoup dans un test? Vous vérifiez si la vue correcte a été rendue, et vous effectuez un appel de référentiel? Ne devraient-ils pas être deux tests distincts? Aussi, quand vérifieriez-vous que GetNews a été appelé? Dans ce même test? Ou séparé? –

Questions connexes