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.
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