Я прочитал много других вопросов по этой теме, и я до сих пор не могу найти решение моей проблемы, поэтому я решил разоблачить свое дело.
У меня есть этот интерфейс
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: выражение ссылается на метод, который не принадлежит к издеваемому объекту..."
Также я хотел бы добавить, что я использую MSTest и Moq
Я знаю, что настройка Mock с помощью Expression непростая и не рекомендуется, но для меня это очень важно, потому что "Найти" - это метод, который я использую много в своем приложении.