我有一个相对简单的接口来模拟,我想为其设置
Run
方法:
public interface IRunner
{
T Run<T>(ILogger log, ExecutionContext context, Func<FunctionContext, T> func);
}
当它被调用时,它看起来像这样:
myRunner.Run(myLog, myContext, async ctx => {
await _do(myContext, myLog, trxData);
});
我一直在尝试这样嘲笑它:
var mockRunner = new Mock<IRunner>();
mockRunner.Setup(
x => x.Run(
It.IsAny<ILogger>,
It.IsAny<ExecutionContext>,
It.IsAny<Func<FunctionContext,T>>
));
但是编译器对此并不满意:
方法
的类型参数无法从用法中推断出来。尝试显式指定类型参数。'IRunner.Run<T>(ILogger,ExecututionContext,Func<FunctionContext,T>)'
我完全被难住了,非常感谢任何想法或建议。
IRunner 接口的 Run 方法是通用的,并且类型为 T,您需要为您正在设置的方法提供显式类型参数。
自从您提到在传递给 Run 的 lambda 中使用 wait 以来,我就假设 T 是 Task。
It.IsAny
例如,如果 Run 应返回一个 Task,则应设置模拟以返回 Task 的实例
mockRunner.Setup(
x => x.Run<Task<ResultType>>(
It.IsAny<ILogger>(),
It.IsAny<ExecutionContext>(),
It.IsAny<Func<FunctionContext, Task<ResultType>>>()
)
).ReturnsAsync(new ResultType());