【发布时间】:2011-12-20 09:56:19
【问题描述】:
我已经阅读了很多关于此主题的其他 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:表达式引用了一个不属于mocked对象的方法......”
另外我想补充一点,我正在使用 MSTest 和 Moq
我知道使用 Expression 设置 Mock 并不容易且不推荐,但这对我来说非常重要,因为“查找”是我在我的应用程序中经常使用的一种方法
【问题讨论】:
标签: .net unit-testing tdd mocking moq