C# 为单元测试构建LINQ表达式

C# 为单元测试构建LINQ表达式,c#,linq-expressions,C#,Linq Expressions,我正在为一个类编写一些单元测试,并且我正在测试的方法采用了一个表达式,我正在尝试构建一个表达式并将其传递给该方法,但我得到了以下错误: System.ArgumentException:静态方法需要空实例, 非静态方法需要非空实例。参数名称:方法 [TestClass] 提供筛选器时的公共类:FindSubscriptionsForCurrentUserTestBase { 称为bool filterFunc; 私有函数filterFunc=>(用户订阅)=> { filterFuncWasCa

我正在为一个类编写一些单元测试,并且我正在测试的方法采用了一个表达式,我正在尝试构建一个表达式并将其传递给该方法,但我得到了以下错误:

System.ArgumentException:静态方法需要空实例, 非静态方法需要非空实例。参数名称:方法

[TestClass]
提供筛选器时的公共类:FindSubscriptionsForCurrentUserTestBase
{
称为bool filterFunc;
私有函数filterFunc=>(用户订阅)=>
{
filterFuncWasCalled=true;
return userSubscription.SubscriptionId==“汽油.价格.每月”;
};
受保护的覆盖表达式筛选器=>
Lambda(Expression.Call(filterFunc.Method));
[测试方法]
public void callsdeailsrepository()
{
UserDetailsRepositoryMock.Verify(x=>x.FindAsync(“userId”,CancellationToken.None),Times.Once);
}
[测试方法]
public void filterFuncGetScaledToFilterSubscriptions()的
{
IsTrue(filterFuncWasCalled);
}
}

有时会实现匿名方法。在您的情况下,匿名方法必须是实例方法,因为您需要访问
this
,才能访问
filterfuncwastcalled
。 因此,您试图调用一个实例方法,但没有传递任何实例。可以通过将常量表达式与实例一起传递来修复此问题:

Expression.Call(Expression.Constant(filterFunc.Target), filterFunc.Method)
但这也不起作用,因为该方法接受一个参数,而您不传递任何参数。让我们使用与lambda表达式相同的表达式。这是实现此目的的完整
过滤器
属性:

Expression<Func<UserSubscription, bool>> Filter { 
    get {
        var param = Expression.Parameter(typeof(UserSubscription));
        var body = Expression.Call(Expression.Constant(filterFunc.Target), filterFunc.Method, param);
        return Expression.Lambda<Func<UserSubscription, bool>>(body, param);
    }
}
表达式筛选器{
得到{
var param=Expression.Parameter(typeof(UserSubscription));
var body=Expression.Call(Expression.Constant(filterFunc.Target)、filterFunc.Method、param);
返回表达式.Lambda(body,param);
}
}

有时会实现匿名方法。在您的情况下,匿名方法必须是实例方法,因为您需要访问
this
,才能访问
filterfuncwastcalled
。 因此,您试图调用一个实例方法,但没有传递任何实例。可以通过将常量表达式与实例一起传递来修复此问题:

Expression.Call(Expression.Constant(filterFunc.Target), filterFunc.Method)
但这也不起作用,因为该方法接受一个参数,而您不传递任何参数。让我们使用与lambda表达式相同的表达式。这是实现此目的的完整
过滤器
属性:

Expression<Func<UserSubscription, bool>> Filter { 
    get {
        var param = Expression.Parameter(typeof(UserSubscription));
        var body = Expression.Call(Expression.Constant(filterFunc.Target), filterFunc.Method, param);
        return Expression.Lambda<Func<UserSubscription, bool>>(body, param);
    }
}
表达式筛选器{
得到{
var param=Expression.Parameter(typeof(UserSubscription));
var body=Expression.Call(Expression.Constant(filterFunc.Target)、filterFunc.Method、param);
返回表达式.Lambda(body,param);
}
}

不使用Expression.Call,,为什么不简单地调用filterFunc()或filterFunc.Invoke()?我想你忘了传递Expression.Call的参数(表达式中的userSubscription)而不是使用Expression.Call,,为什么不简单地调用filterFunc()或filterFunc.Invoke()?我想你忘了传递参数(表达式中的userSubscription)用于expression.Call