我想知道是否可以模拟在目标测试方法中实例化的类的方法的返回。这里的不同之处在于,要实例化此对象,必须在其构造函数中传递一个从静态类返回的对象。请按照示例进行操作,以使其更加清晰。
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
}
到目前为止,我的想法是将这个过程封装在另一个类中。并使用依赖注入来模拟该返回。但是,我认为这是一个非常糟糕的解决方案。
发布于 2020-07-28 19:22:28
我不认为创建一个工厂并注入它,这是一个糟糕的解决方案
我想像这样的事情应该是...
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();
}
}
https://stackoverflow.com/questions/63141063
复制