如何在另一个方法内部模拟 return 方法调用

How to mock a return of method call internal a other method

我想知道是否可以模拟在目标测试方法中实例化的 class 方法的 return。这里的不同点是,要实例化这个对象,有必要在其构造函数中传递一个对象returned from a static class。按照例子更清楚。

public async Task Invoke(HttpContext httpContext)
{
    GrpcChannel channel = GrpcChannel.ForAddress("address");
    var client = new MethodDescriptorCaller(channel);
    client.CallGrpcAsync(); //I need to mock the return of this method
}

到目前为止,我的想法是将这个过程封装在另一个 class 中。并使用依赖注入来模拟 return。但是,我认为这是一个非常糟糕的解决方案。

我不认为创建工厂并注入它,IMO 根本不是一个糟糕的解决方案

我觉得应该是这样的...

interface IMethodDescriptorCallerFactory
{
  MethodDescriptorCaller Build(GrpcChannel channel);
}

class MethodDescriptorCallerFactory : IMethodDescriptorCallerFactory
{
  MethodDescriptorCaller Build(GrpcChannel channel)
  {
    return new MethodDescriptorCaller(channel);
  }
}

class Foo
{
  IMethodDescriptorCallerFactory _methodDescriptorCallerFactory;

  public Foo(IMethodDescriptorCallerFactory methodDescriptorCallerFactory)
  {
    _methodDescriptorCallerFactory = methodDescriptorCallerFactory
  }

  public async Task Invoke(HttpContext httpContext)
  {
      GrpcChannel channel = GrpcChannel.ForAddress("address");
      var client = _methodDescriptorCallerFactory.Build(channel);
      client.CallGrpcAsync(); //I need to mock the return of this method
  }
}


class FooTest
{
  [Fact]
  public async Task Test_Invoke()
  {
    var methodDescriptorCaller = Mock.Of<MethodDescriptorCaller>(m =>
        m.CallGrpcAsync() == Task.Completed
    );

    var methodDescriptorCallerFactory = Mock.Of<IMethodDescriptorCallerFactory>(m =>
        m.Build(It.IsAny<GrpcChannel>()) == methodDescriptorCaller
    );

    var foo = new Foo(methodDescriptorCallerFactory);

    var httpContext = Mock.Of<HttpContext>();

    await foo.Invoke(httpContext);

    Mock.Get(methodDescriptorCallerFactory).VerifyAll();
    Mock.Get(methodDescriptorCaller).VerifyAll();
  }
}