使用lambda表达式设置方法

本文关键字:方法 设置 表达式 lambda 使用 | 更新日期: 2023-09-27 18:18:24

我试图通过使用相应的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; }
}

语法似乎没有问题,但是代码出现了ArgumentException:

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

任何想法吗?

使用lambda表达式设置方法

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

你说你想要你的IMethodCall实例返回一个特定的值,当它的RunMethod方法与你的stubService作为参数调用。在这种情况下,您需要传入一个模拟IMethodCall,因为这是您正在定义其行为的对象。

如果您查看这里的示例,您将看到所有被模拟的方法都是模拟上的方法。所以,如果你可以重构你的TService类型,让它接受一个methodCall,你可能会让它工作。

为您服务

public IService 
{
     TResult ExecuteMethodCall(IMethodCall<IService, TResult>);
}

然后在你的测试

stubService.Setup(t => t.ExecuteMethodCall(methodCall))