Moq - 用于模拟泛型方法的正确设置

时间:2014-12-22 22:14:53

标签: c# generics moq

我正在尝试模拟一个通用方法,但它并没有按预期工作。

我有这个服务定义

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以返回正确的处理程序?

2 个答案:

答案 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的原因