C# 使用lambda表达式设置方法

C# 使用lambda表达式设置方法,c#,lambda,integration-testing,moq,C#,Lambda,Integration Testing,Moq,我试图通过使用相应的lambda表达式在实例上伪造一个方法: private void TranslateCallbackToSetup<TResult>(Mock<TService> stubService, IMethodCall<TService,TResult> methodCall) { stubService.Setup(t => methodCall.RunMethod(t)).Returns(() => {

我试图通过使用相应的lambda表达式在实例上伪造一个方法:

private void TranslateCallbackToSetup<TResult>(Mock<TService> stubService, IMethodCall<TService,TResult> methodCall)
{
    stubService.Setup(t => methodCall.RunMethod(t)).Returns(() =>
    {                
         return default(TResult);
    });
}

public interface IMethodCall<in TService, out TResult> : IMethodCall where TService : class
{
    Func<TService, TResult> RunMethod { get; }
}
private void TranslateCallbackToSetup(模拟stubService、IMethodCall方法调用)
{
stubService.Setup(t=>methodCall.RunMethod(t))。返回(()=>
{                
返回默认值(TResult);
});
}
公共接口IMethodCall:IMethodCall,其中TService:class
{
Func运行方法{get;}
}
语法似乎很好,但代码失败,出现了ArgumentException:

表达式不是方法调用:t=>t


有什么想法吗?

这是失败的,因为您试图在模拟本身之外的其他东西上设置方法

您的意思是,当使用
stubService
作为参数调用其
RunMethod
方法时,希望您的
IMethodCall
实例返回某个值。在这种情况下,您需要传入一个mock
IMethodCall
,因为这是您正在定义其行为的对象

如果您查看这些示例,您将看到所有被模拟的方法都是模拟上的方法。因此,如果您可以重构您的TService类型以接受methodCall,那么您可能会让它工作起来

为您效劳

public IService 
{
     TResult ExecuteMethodCall(IMethodCall<IService, TResult>);
}
stubService.Setup(t => t.ExecuteMethodCall(methodCall))