2009-08-08 6 views
0

Donc, j'utilise moq pour tester, mais j'ai rencontré un problème qui m'empêche de me moquer correctement, du moins je le pense. Ceci est ma classe référentiel:Problème MOQ - la classe mockée renvoie des données incorrectes

public interface IAccountsRepository 
    { 
     IQueryable<Account> Accounts { get; } 
     IQueryable<Account> AccountsPaged(int pageSize, int selectedPage); 
    } 

C'est l'une des implémentations (faux):

public class FakeAccountsRepository : IAccountsRepository 
    { 
     private static readonly IQueryable<Account> FakeAccounts = new List<Account> { 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"}, 
     new Account {RegistrationEmail = "[email protected]"} 
     }.AsQueryable(); 

     public IQueryable<Account> Accounts 
     { 
      get { return FakeAccounts; } 
     } 

     public IQueryable<Account> AccountsPaged(int pageSize, int selectedPage) 
     { 
      return FakeAccounts.Skip((selectedPage - 1)*pageSize).Take(pageSize).AsQueryable(); 
     } 
    } 

Ceci est une définition du contrôleur qui fonctionne parfaitement avec la page réel et des données fausses ou sql (IoC) l'intérieur d'une vraie page web:

public class AccountsController : Controller 
    { 
     private IAccountsRepository _accountsRepository; 
     public int PageSize = 3; 

     public AccountsController(IAccountsRepository accountsRepository) 
     { 
      this._accountsRepository = accountsRepository; 
     } 

     public ViewResult List(int selectedPage) 
     { 
       return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 
    } 

Ceci est une méthode moq:

static IAccountsRepository MockAccountsRepository(params Account[] accs) 
     { 
      // Generate an implementor of IAccountsRepository at runtime using Moq 
      var mockProductsRepos = new Moq.Mock<IAccountsRepository>(); 
      mockProductsRepos.Setup(x => x.Accounts).Returns(accs.AsQueryable()); 
      return mockProductsRepos.Object; 
     } 

il fonctionne très bien avec cette mise en œuvre de la liste Pagination:

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.Accounts.Skip((selectedPage - 1) * PageSize).Take(PageSize).ToList()); 

     } 

mais il échoue lorsque vous utilisez ceci:

public ViewResult List(int selectedPage) 
     { 
      return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList()); 
     } 

Sans changer de test et en ne changeant que la mise en œuvre de la liste (faisant pagination uniquement sur .Accounts Tout fonctionne, mais lorsque j'essaie d'utiliser la méthode AccountsPaged, il échoue à ne renvoyer aucun élément. En utilisation réelle, sur une page Web, cela fonctionne dans les deux sens.

S'il vous plaît aviser, merci.

EDIT: Si je fais ceci:

mockProductsRepos.Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())).Returns(accs.AsQueryable()); 

Je reçois 5 articles retournés au lieu de 2.

Répondre

2

Tu as fait méthode pas AccountsPaged d'installation dans votre maquette

EDIT: Maintenant que vous avez configuré AccountsPaged, vous ne l'avez pas configuré correctement. Voici comment configurer correctement:

mockProductsRepos 
    .Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())) 
    .Returns((int pageSize, int selectedPage) => accs.Skip((selectedPage-1)*pageSize).Take(pageSize).AsQueryable()); 
+0

Je l'ai configuré maintenant, comme j'ai ajouté au post ci-dessus, mais il me donne 5 articles au lieu de 2 - ce qui serait attendu si l'appel .List() fonctionnait correctement. Je ne sais pas comment cela pourrait-il se passer et pourquoi retourne-t-il les membres à part entière? Y at-il un moyen de déboguer étape par étape de l'installation moq? – BuzzBubba

1

Je n'ai pas Parse par votre code en profondeur, mais une règle générale est - En cas de doute en ce qui concerne la justesse fausse, utilisez moqueur stricte pour débusquer toutes les attentes manquantes :

var mock = nouveau Mock (MockBehavior.Strict); De cette façon, vous obtiendrez des indications explicites des appels inattendus émis par le SUT que vous avez oublié de simuler.

Questions connexes