在模拟上设置一个方法,其参数是异步函数表达式

问题描述 投票:0回答:1

我有一个相对简单的接口来模拟,我想为其设置

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>)'
的类型参数无法从用法中推断出来。尝试显式指定类型参数。

我完全被难住了,非常感谢任何想法或建议。

c# moq
1个回答
0
投票

IRunner 接口的 Run 方法是通用的,并且类型为 T,您需要为您正在设置的方法提供显式类型参数。

自从您提到在传递给 Run 的 lambda 中使用 wait 以来,我就假设 T 是 Task。

It.IsAny>(),指定一个接受 FunctionContext 并返回 Task 的函数。

例如,如果 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());
© www.soinside.com 2019 - 2024. All rights reserved.