将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());

我错过了什么?

将Moq与泛型和Linq表达式一起使用

我不知道您是否已经能够解决这个问题,但您向It.IsAny<>传递了错误的类型参数。

您对Setup的呼叫实际上应该是:

mock.Setup(foo => foo.Single(It.IsAny<Expression<Func<MyObject, bool>>>()))
    .Returns(new MyObject());

如果我理解你想做什么,Single是一个静态/扩展方法,不能用Moq来嘲笑。Moq的工作原理是对测试对象进行子类化,所以静态不起作用。您必须在Any方法上设置mock(只要Any方法本身不是扩展方法即可)。