我有一个相对简单的模拟接口,我想为它设置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>)'的类型参数不能从用法中推断出来.try 显式指定类型参数.

我完全被困在这一点上,并非常感谢任何 idea 或建议.

推荐答案

IRunner接口的run方法是泛型的,类型为T,您需要为正在设置的方法提供显式的类型参数.

我假设T是Task,因为你提到在传递给Run的lambda中使用await.

It.IsAny<;Func<;FunctionContext,Task>;>;(),指定接受FunctionContext并返回任务的函数.

例如,如果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());

Csharp相关问答推荐

在命令行中使用时安装,但在单击时不会安装

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

为什么C#Bigbit不总是相同的比特长度?

为什么在ANTLR4中会出现不匹配的输入错误?""

Select Many和默认IfEmpty内部Select Many错误工作

在C#中使用类中的对象值

可为空的泛型属性

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

使用Orleans进行的单元测试找不到接口的实现

如何在实体框架中添加包含列表?

C#-VS2022:全局使用和保存时的代码清理

Docker Container中的HttpRequest后地址不可用

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

正确处理嵌套的本机集合

交替的奇数

用C#从XML内部元素中获取特定值

为什么我不能从我的异步任务方法中返回异步任务方法?

我是否应该注销全局异常处理程序

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

能否将我图表中的星号与X轴上一天中的第二位数字对齐?