2010-12-04 48 views
1

J'utilise ASP.NET MVC 2, NUnit, Moq et MVC Contrib. J'ai écrit mon premier test unitaire et j'ai quelques questions concernant ce test. Mon scénario est que j'ai une vue Index. Sur cette vue, j'ai une grille qui affiche toutes les nouvelles.Pointeurs nécessaires lors du premier test avec NUnit et MVC Contrib

Voici ma classe INewsRepository:

public interface INewsRepository 
{ 
    IEnumerable<News> FindAll(); 
} 

Ma classe de test avec la méthode d'essai:

public class NewsControllerTest :TestControllerBuilder 
{ 
    private Mock<INewsRepository> mockNewsRepository; 
    private NewsController newsController; 

    [SetUp] 
    public void Init() 
    { 
     mockNewsRepository = new Mock<INewsRepository>(); 
     newsController = new NewsController(mockNewsRepository.Object); 
     InitializeController(newsController); 
    } 

    [Test] 
    public void NewsController_Index() 
    { 
     // Arrange 
     var news = new Mock<IEnumerable<News>>(); 
     mockNewsRepository.Setup(r => r.FindAll()).Returns(news.Object).Verifiable(); 

     // Act 
     ActionResult actual = newsController.Index(); 

     // Assert 
     mockNewsRepository.Verify(); 
     actual 
     .AssertViewRendered() 
     .ForView("Index") 
     .WithViewData<News[]>() 
     .ShouldBe(news); 
    } 
} 

Mon point de vue:

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

je besoin de quelques conseils sur la façon dont Je l'ai fait. Suis-je dans la bonne direction? Que devrais-je ajouter, que devrais-je omettre? Je veux faire des tests unitaires, est-ce que je mélange avec des tests d'intégration? Tout conseil supplémentaire serait apprécié.

Quand je lance ce test dans la console GUI NUnit je reçois une erreur de retour et I'mnot sûr de ce que cela signifie:

MyProject.Web.Tests.Controllers.NewsControllerTest.NewsController_Index: 
Moq.MockVerificationException : The following setups were not matched: 
INewsRepository r => r.FindAll() 

Répondre

3
public ActionResult Index() 
{ 
    FakeNewsRepository fakeNewsRepository = new FakeNewsRepository(); 
    IEnumerable<News> news = fakeNewsRepository.FindAll(); 
    return View(news); 
} 

Vous ne pouvez pas se moquer du dépôt qui est codé en dur comme celui-ci dans votre action. Vous l'instanciez à l'intérieur de l'action, vous ne serez jamais capable de tester cette unité et de vous moquer du référentiel. Le référentiel doit être injecté en tant que dépendance. Vous pouvez utiliser une interface et de transmettre cette interface au constructeur de votre contrôleur:

public class HomeController: Controller 
{ 
    private readonly IRepository _repository; 
    public class HomeController(IRepository repository) 
    { 
     _repository = repository; 
    } 

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

maintenant dans votre test unitaire vous pouvez passer l'instance se moque de votre référentiel au constructeur du contrôleur et définir les attentes.

Notez également que MVCContrib.TestHelper est conçu pour fonctionner avec Rhino Mocks. Je ne suis pas sûr que cela fonctionne bien avec Moq.

+0

Dans votre code, vous avez un nom de variable pour un contrôleur appelé _sut. Pourquoi avez-vous appelé ça? –

+0

Sujet en cours de test. De cette façon, il est clair quel est le type testé. –

+0

Y at-il autre chose que vous pouvez commenter lorsque je teste mes contrôleurs? Est-ce que je fais beaucoup dans un test, trop peu? Quels pointeurs pouvez-vous me donner lors du test des contrôleurs? –