Проблемы с макетом репозитория с Moq - PullRequest
2 голосов
/ 13 апреля 2011

Я пытаюсь смоделировать мой репозиторий с помощью Moq.Я пытаюсь смоделировать все методы запроса в моем репозитории.Я успешно смоделировал метод, возвращающий все для того типа, который я смоделировал.

Пример:

mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());

Однако у меня возникла проблема при создании метода, которыйиспользует другой метод.Например, мой метод «FilterBy» возвращает вызов моего метода «GetAll» с предложением Where, которое принимает выражение

Пример: метод репозитория

public virtual IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
{
   return GetAll().Where(expression);
}

Обнадеживает то, что я надеялся смоделировать все методы в репозитории в классе помощника:

public static IRepository<Product> MockProductRepository(params Product[] products) {
        var mockProductRepo = new Mock<IRepository<Product>>();
        mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());
        mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(products.AsQueryable().Where(It.IsAny<Expression<Func<Product, bool>>>()));
        return mockProductRepo.Object;
}

Так что вместо метода FilterBy, описанного выше, есть способ настроить его на вызовна другом методе макета вместо того, как у меня это в приведенном выше примере?

ОБНОВЛЕНИЕ

Я попытался настройки:

mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(mockProductRepo.Object.GetAll().Where(It.IsAny<Expression<Func<Product, bool>>>()));

И всегда ошибки, что «Значение не может быть нулевым. Параметр: предикат».Из того, что я понимаю о трассировке стека, это жалоба, потому что я не передаю предикат «Где».Я не уверен, как в настройке обозначить выражение, переданное в метод FilterBy для использования в фильтре Где.

1 Ответ

7 голосов
/ 14 апреля 2011

Я сам понял.

mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns((Expression<Func<Product,bool>> filter) => mockProductRepo.Object.GetAll().Where(filter));
...