0

所以,我使用最小起订量进行测试,但我遇到了一个问题,阻止我正确地模拟,至少我是这么认为的。这是我的存储库类:

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 件。

4

2 回答 2

2

您没有在模拟中设置 AccountsPaged 方法

编辑:现在您设置了 AccountsPaged,但您没有正确设置它。在这里如何正确设置它:

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() );
于 2009-08-08T22:31:34.797 回答
1

我没有深入解析您的代码,但一般的经验法则是 - 当对模拟的正确性有疑问时,使用严格的模拟来消除任何缺失的期望:

var mock = new Mock(MockBehavior.Strict);

这样,您将获得您忘记模拟的 SUT 发出的任何意外调用的明确指示。

于 2009-08-10T23:10:57.150 回答