如何模拟来自另一个命令处理程序的命令处理程序调用

本文关键字:命令处理程序 另一个 调用 何模拟 模拟 | 更新日期: 2023-09-27 17:57:14

我有UpdateHandler,我想测试它是否有效。但是,我有一个问题,我不知道如何模拟CanChangeHandler

我为此处理程序创建了另一个测试。在 UpdateHandler 中,我想得到 canChangeResponse 与 Can 是真/假,并且基于此我想测试 UpdateHandlercanChangeResponse

我尝试了几种不同的方法来模拟两者,commandDispatherCanChangeHandler,但它只是没有奏效。

有人有类似问题的经验吗?

我的代码在下面(我只放了相关的代码来显示问题所在)。

public UpdateHandler(ICommandDispatcher commandDispatcher)
{
    _commandDispatcher = commandDispatcher;
}
public override SimpleResponse Handle(CreateScheduleCommand command)
{
    try
    {
        var canChangeResponse = _commandDispatcher.Get<CanResponse>(
            new CanChangeCommand(command.Id));
        if (!canChangeResponse.Can)
        {
            return new SimpleResponse(canChangeResponse.Why);
        }
        //update code comes here and I want to test this
        return new SimpleResponse();
    }
    catch (Exception e)
    {
        _log.CommandError(command, e);
        return new SimpleResponse(Resources.GeneralFailure);
    }
}

测试设置:

_container = new WindsorContainer();
new ContainerConfiguration(_container).Apply();
_container.Install(new MongoRepositoriesInstaller(_mongoConnectionString, typeof(User).Assembly));
_container.Install(new CommandHandlersInstaller());
//new CommandProcessorConfiguration(_container).Apply();
var commandDispatcher = new Mock<ICommandDispatcher>();
commandDispatcher.Setup(x => x.Get<CanResponse>(new CanUpdateCommand())).Returns(new CanResponse { Can = true });
var canUpdateHandler = new Mock<ICommandHandler<CanUpdateCommand, CanResponse>>();
canUpdateHandler.Setup(x => x.Handle(new CanUpdateCommand())).Returns(new CanResponse { Can = true });
_container.Register(Component.For<ICommandHandler<CanUpdateCommand, CanResponse>>().Instance(canUpdateHandler.Object));

测试:

[Ignore]
[Test]
public void Update()
{
    // Arrange
    var commandDispatcher = Container.Resolve<ICommandDispatcher>();
    var handler = new UpdateHandler(commandDispatcher);
    // Act
    var response = handler.Handle(new UpdateCommand());
    // Assert
    Assert.IsFalse(response.HasErrors);
}

如何模拟来自另一个命令处理程序的命令处理程序调用

不确定为什么要在单元测试中使用 IOC 容器,这增加了一些额外的处理复杂性。您可以轻松地在ICommandDispature上设置存根。

        var stubCommandDispatcher = new Mock<ICommandDispatcher>();
        stubCommandDispatcher.Setup(x => x.Get<CanResponse>
            (It.IsAny<CanChangeCommand>()))
            .Returns(new CanResponse() {Can = true});
        var stubScheduleCommand = new Mock<CreateScheduleCommand>();
        var sut = new UpdateHandler(stubCommandDispatcher.Object);
        var r = sut.Handle(stubScheduleCommand.Object);