2014-12-22 74 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實現,所以我不能嘲笑它。 –