如何模拟来自另一个命令处理程序的命令处理程序调用
本文关键字:命令处理程序 另一个 调用 何模拟 模拟 | 更新日期: 2023-09-27 17:57:14
我有UpdateHandler,我想测试它是否有效。但是,我有一个问题,我不知道如何模拟CanChangeHandler。
我为此处理程序创建了另一个测试。在 UpdateHandler 中,我想得到 canChangeResponse 与 Can 是真/假,并且基于此我想测试 UpdateHandlercanChangeResponse 为空。
我尝试了几种不同的方法来模拟两者,commandDispather和CanChangeHandler,但它只是没有奏效。
有人有类似问题的经验吗?
我的代码在下面(我只放了相关的代码来显示问题所在)。
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);