1

我有一个 CommandController 类,负责向 CommandService 提供 Module 命令。为了隐藏实现,类注册命令并在实现中包含私有方法,如下所示:

internal class CommandController
{
    private ICommandService commandService;

    public void RegisterCommands()
    {
        this.commandService.Register("ExampleCommand", this.ExecuteExampleCommand);
    }

    private void ExecuteExampleCommand()
    {
        ... implementation here ...
    }
}

如何在模拟 ICommandService 的单元测试中测试 ExecuteExampleCommand,这样我一次不会测试多个类(无论如何我可能不会在 UT 环境中注册该服务)?

我希望这个问题足够清楚。

4

2 回答 2

1

您可以使用轻松访问 mock 的方法调用参数WhenCalled。例如,如果你想执行传递给你的动作,Register你可以这样做:

registry.Stub(r => r.Register(
        Arg<String>.Is.Equal("ExampleCommand"),
        Arg<Action>.Is.Anything))
    .WhenCalled(invocation => ((Action) invocation.Arguments[1])());

RegisterCommands被调用时,mock 会执行你的私有方法。

于 2013-06-19T10:12:38.760 回答
1

我可能错了,但我认为应该将方法“ExecuteExampleCommand”提取到一个类中,例如“ ExampleCommandHandler ”。然后,在 Register 命令中,您将传递命令和可以模拟的ExampleCommandHandler

internal class CommandController
{
    private ICommandService commandService;

    public void RegisterCommands()
    {
        this.commandService.Register("ExampleCommand", this.ExampleCommandHandler);
    }

    private ExampleCommandHandler exampleCommandHandler;
}

internal class ExampleCommandHandler : ICommandHandler
{
    void Execute()
    {
    }
}

要不就

this.commandService.Register("ExampleCommand", new ExampleCommandHandler())
于 2013-06-19T09:52:22.607 回答