我正在尝试模拟一个通用方法,但它并没有按预期工作。
我有这个服务定义
public interface ICommandHandlerFactory {
ICommandHandler<T> GetHandler<T>() where T : ICommand;
}
和这个Moq设置
var handler = new TestCommandHandler();
var handlerFactory = Mock.Of<ICommandHandlerFactory>(o =>
o.GetHandler<TestCommand>() == handler);
如果我使用特定类型在模拟上调用GetHandler
方法,例如GetHandler<TestCommand>
一切都按预期工作,它返回TestCommandHandler
类的实例。
但是如果将mock注入另一个泛型类
public class CommandBus {
private ICommandHandlerFactory _handlerFactory;
public ICommandHandler GetHandler<T>(T command) where T : ICommand {
return _handlerFactory.GetHandler<T>();
}
}
以下代码返回null
var command = new TestCommand();
return commandBus.GetHandler(command);
即使在这种情况下,我应如何设置Moq以返回正确的处理程序?
答案 0 :(得分:0)
你尝试过这样的事吗?
var handler = new TestCommandHandler();
Mock<ICommandHandlerFactory> handlerFactory = new Mock<ICommandHandlerFactory>();
handlerFactory.Setup(x => x.GetHandler<TestCommand>()).Returns(handler);
Mock<CommandBus> commandBus = new Mock<CommandBus>();
commandBus.Setup(x => x.GetHandler<TestCommand>(It.IsAny<TestCommand>())).Returns(handler);
答案 1 :(得分:0)
原始代码有效,初始化TestCommand
类的辅助方法存在问题,但问题中未包含此问题。
初始化时,命令被转换为其基接口(ICommand
)。模拟设置为返回TestCommand
类型的处理程序但是使用ICommand
类型调用 - 这就是它返回null
的原因