C# 使用lambda表达式设置方法
我试图通过使用相应的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(() => {
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
实例返回某个值。在这种情况下,您需要传入一个mockIMethodCall
,因为这是您正在定义其行为的对象
如果您查看这些示例,您将看到所有被模拟的方法都是模拟上的方法。因此,如果您可以重构您的TService类型以接受methodCall,那么您可能会让它工作起来
为您效劳
public IService
{
TResult ExecuteMethodCall(IMethodCall<IService, TResult>);
}
stubService.Setup(t => t.ExecuteMethodCall(methodCall))