我试图通过使用相应的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 =&gt;吨
有什么想法吗?
答案 0 :(得分:3)
这是失败的,因为你试图在模拟本身以外的地方设置一个方法。
您说当您使用IMethodCall
作为参数调用RunMethod
方法时,您希望stubService
实例返回特定值。在这种情况下,您需要传入模拟IMethodCall
,因为这是您正在定义的行为。
如果查看示例here,您将看到所有被模拟的方法都是mock上的方法。因此,如果您可以重构TService类型以取代methodCall,那么您可以使其工作。
关于您的服务
public IService
{
TResult ExecuteMethodCall(IMethodCall<IService, TResult>);
}
然后在你的测试中
stubService.Setup(t => t.ExecuteMethodCall(methodCall))