Я был прочитан многими другими 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);
}
И это базовая структура метода, содержащего макет, который я хотел бы настроить
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 нелегко и не рекомендуется, но это очень важно для меня, потому что "Find"метод, который я часто использую в своем приложении