如何在另一个方法内部模拟 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();
}
}
我想知道是否可以模拟在目标测试方法中实例化的 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();
}
}