所以,我使用最小起订量进行测试,但我遇到了一个问题,阻止我正确地模拟,至少我是这么认为的。这是我的存储库类:
public interface IAccountsRepository
{
IQueryable<Account> Accounts { get; }
IQueryable<Account> AccountsPaged(int pageSize, int selectedPage);
}
这是实现之一(假的):
public class FakeAccountsRepository : IAccountsRepository
{
private static readonly IQueryable<Account> FakeAccounts = new List<Account> {
new Account {RegistrationEmail = "first@demo.org"},
new Account {RegistrationEmail = "second@demo.org"},
new Account {RegistrationEmail = "third@demo.org"},
new Account {RegistrationEmail = "fourth@demo.org"},
new Account {RegistrationEmail = "fifth@demo.org"}
}.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();
}
}
这是一个控制器定义,可以完美地与真实页面和真实网页中的假数据或 sql 数据 (IoC) 配合使用:
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());
}
}
这是起订量方法:
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;
}
它适用于列表分页的这种实现:
public ViewResult List(int selectedPage)
{
return View(_accountsRepository.Accounts.Skip((selectedPage - 1) * PageSize).Take(PageSize).ToList());
}
但使用它时失败:
public ViewResult List(int selectedPage)
{
return View(_accountsRepository.AccountsPaged(PageSize, selectedPage).ToList());
}
无需更改测试并仅更改 List 实现(仅在 .Accounts 上进行分页),一切正常,但是当我尝试使用 AccountsPaged 方法时,它无法返回任何元素。在实际使用中,在网页上,它可以双向工作。
请指教,谢谢。
编辑:如果我这样做:
mockProductsRepos.Setup(x => x.AccountsPaged(Moq.It.IsAny<int>(), Moq.It.IsAny<int>())).Returns(accs.AsQueryable());
我退回了 5 件物品而不是 2 件。