将Moq与泛型和Linq表达式一起使用
本文关键字:表达式 一起 Linq Moq 泛型 | 更新日期: 2023-09-27 17:58:43
我有以下通用方法:
public bool Any<TEntity>(Expression<Func<TEntity, bool>> whereCondition) where TEntity : class
{
bool result = false;
ObjectQuery<TEntity> query = CreateObjectSet<TEntity>();
var queryResult = query.Where(whereCondition);
if(queryResult.Count() > 0)
result = true;
return result;
}
使用Moq,我模拟了这个方法所在的类的一个实例
现在我想模拟一下这个方法的返回结果:
var mock = new Mock<ITestRepository>();
mock.Setup(foo => foo.Single<MyObject>(It.IsAny<Expression>)).Returns(new MyObject());
我错过了什么?
我不知道您是否已经能够解决这个问题,但您向It.IsAny<>
传递了错误的类型参数。
您对Setup
的呼叫实际上应该是:
mock.Setup(foo => foo.Single(It.IsAny<Expression<Func<MyObject, bool>>>()))
.Returns(new MyObject());
如果我理解你想做什么,Single是一个静态/扩展方法,不能用Moq来嘲笑。Moq的工作原理是对测试对象进行子类化,所以静态不起作用。您必须在Any方法上设置mock(只要Any方法本身不是扩展方法即可)。