2014-12-22 51 views
2

我试图嘲讽通用方法,并且它不按预期方式工作。Moq - 嘲讽通用方法的正确设置

我有这样的服务定义

public interface ICommandHandlerFactory { 
    ICommandHandler<T> GetHandler<T>() where T : ICommand; 
} 

和这个起订量设置

var handler = new TestCommandHandler(); 
var handlerFactory = Mock.Of<ICommandHandlerFactory>(o => 
    o.GetHandler<TestCommand>() == handler); 

如果我请模拟GetHandler方法与特定的类型例如GetHandler<TestCommand>一切都按预期工作,并返回TestCommandHandler类的实例。

但是,如果模拟被注入到另一个泛型类

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); 

我应该如何设置起订量,即使在这种情况下返回正确的处理程序?

回答

0

原代码的作品,有在初始化TestCommand类的辅助方法的问题,并且不包括在这一问题。

初始化时,命令被传送到其基本接口(ICommand)。模拟是设置返回处理程序TestCommand类型,但被称为与ICommand类型 - 这就是为什么它返回null

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); 
+0

不,我没有,因为我想测试我的CommandBus实现,所以我不能嘲笑它。 –