2009-06-14 9 views
4

J'ai des difficultés à écrire un test unitaire pour l'une de mes actions de contrôleur. Voici les détails.Utilisation de MOQ pour tester le contrôleur

Ce point de vue est fortement typée:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Request>>" 

est la méthode Ici, dans le contrôleur en cours de test:

// GET: /Request/List 
    public ActionResult List() 
    { 
     return View("List", 
      requestRepository.GetAll(User.Id).OrderByDescending(x => x.Id)); 
    } 

Voici l'extrait du test (nUnit, QMC) qui me donne problèmes:

//mockRequestRepository 
    // .Setup(repo => repo.GetAll(It.IsAny<int>())) 
    // .Returns(List<Request>()); 
    //mockRequestRepository 
    // .Setup(repo => repo.GetAll(It.IsAny<int>())) 
    // .Returns(IList<Request>()); 
    //mockRequestRepository 
    // .Setup(repo => repo.GetAll(It.IsAny<int>())) 
    // .Returns(IEnumerable<List<Request>>()); 
    mockRequestRepository 
      .Setup(repo => repo.GetAll(It.IsAny<int>())) 
      .Returns(It.IsAny<List<Request>>()); 

Les trois premières instructions d'installation ne compileront pas en raison d'une ambiguïté invocation:

Moq.Language.Flow.IReturnsResult<Core.Repositories.IRequestRepository> 
Returns(System.Collections.Generic.IList<Core.Entities.Request> 
(in interface IReturns<IRequestRepository, IList<Request>>) 

Moq.Language.Flow.IReturnsResult<Core.Repositories.IRequestRepository> 
Returns(System.Func<System.Collections.Generic.IList<Core.Entities.Request>> 
(in interface IReturns<IRequestRepository, IList<Request>>) 

La quatrième compilera mais jette cette erreur lorsqu'il atteint l'instruction de retour dans l'action du contrôleur:

InnerException {"Value cannot be null.\r\nParameter name: source"} 
System.Exception {System.ArgumentNullException} 

Je ne pense pas qu'il est pertinent, mais il y a deux surcharges sur la méthode, GetAll() et GetAll (int UserId). Je suis sûr qu'il a quelque chose à faire le OrderBy sur la liste, mais je suis assez fragile sur les concepts Func. Merci de votre aide!

Répondre

5

Essayez ceci:

mockRequestRepository.Setup(repo => repo.GetAll(It.IsAny<int>())) 
    .Returns(new List<Request> { /* empty list */ }); 

ou

mockRequestRepository.Setup(repo => repo.GetAll(It.IsAny<int>())) 
    .Returns(new List<Request> { 
     new Request { Prop1 = ..., PropN = ... }, 
     new Request { Prop1 = ..., PropN = ... }, 
     ... 
    }); 
8

Vous pouvez également utiliser NBuilder avec moq.

_repository.Setup(rep => rep.GetAll(It.IsAny<int>())) // <-- Moq magic 
    .Returns( 
     Builder<Request>.CreateListOfSize(10).Build() // <-- NBuilder magic 
    ); 
Questions connexes