Проблема с MOQ — фиктивный класс возвращает неверные данные

Итак, я использую moq для тестирования, но столкнулся с проблемой, которая не позволяет мне правильно издеваться, по крайней мере, я так думаю. Это мой класс репозитория:

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 = "[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();
        }
    }

Это определение контроллера, которое отлично работает с реальной страницей и поддельными данными или данными 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());
        }
    }

Это метод 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;
        }

он отлично работает с этой реализацией разбивки на страницы списка:

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.


person BuzzBubba    schedule 08.08.2009    source источник


Ответы (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() );
person Michaël Larouche    schedule 08.08.2009
comment
Я настроил его сейчас, как я добавил к сообщению выше, но он дает мне 5 элементов вместо 2, чего можно было бы ожидать, если бы вызов .List() работал правильно. Я не знаю, как это могло быть и почему он возвращает полноправных членов? Есть ли способ пошаговой отладки настройки moq? - person BuzzBubba; 09.08.2009

Я не анализировал ваш код в какой-либо степени, но общее эмпирическое правило таково: если вы сомневаетесь в корректности фиктивной правильности, используйте строгое насмешливое насмешливое выражение, чтобы избавиться от любых отсутствующих ожиданий:

var mock = новый макет (MockBehavior.Strict);

таким образом вы получите явные указания на любые неожиданные вызовы, выданные SUT, которые вы забыли имитировать.

person Addys    schedule 10.08.2009