Moq.Mock < Expression >> () - как настроить выражения в Mock с помощью Moq

Я читал много других QA по этой теме, и я все еще не могу найти решение моей проблемы, поэтому я решил раскрыть свой случай.

У меня есть этот интерфейс

public interface IRepository<T> where T : class, IEntity 
{
    IQueryable<T> Find(Expression<Func<T, bool>> predicate);
    T FindIncluding(int id, params Expression<Func<T, object>>[] includeProperties);
}

И это основная структура метода, содержащего Mock, который я хотел бы настроить

public PeopleController CreatePeopleController()
{
    var mockUnitofWork = new Mock<IUnitOfWork>();
    var mockPeopleRepository = new Mock<IRepository<Person>>();

    mockPeopleRepository.Setup(r=>r.Find().Returns(new Person(){});
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
    return new PeopleController(mockUnitofWork.Object);
}

Я пытался настроить Mock следующим образом:

public PeopleController CreatePeopleController()
{
    var mockUnitofWork = new Mock<IUnitOfWork>();
    var mockPeopleRepository = new Mock<IRepository<Person>>();

    mockPeopleRepository.Setup(r=>r.Find(It.isAny<Expression<Func<Person,bool>>>()).Single()).Returns(new Person(){});
    mockUnitofWork.Setup(p => p.People).Returns(mockPeopleRepository.Object);
    return new PeopleController(mockUnitofWork.Object);
}

Но система всегда выдает одно и то же исключение «System.NotSupportedException: Expression ссылается на метод, не принадлежащий фиктивному объекту ....»

Также я хотел бы добавить, что я использую MSTest и Moq

Я знаю, что настройка Мок с использованием Expression - это непросто и не рекомендуется, но для меня это очень важно, потому что "Найти" - это метод, который я часто использую в своем приложении

15
задан Ray 2 November 2011 в 15:04
поделиться