如何模拟命令服务以调用由它调用的私有方法



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

internal class CommandController
{
    private ICommandService commandService;
    public void RegisterCommands()
    {
        this.commandService.Register("ExampleCommand", this.ExecuteExampleCommand);
    }
    private void ExecuteExampleCommand()
    {
        ... implementation here ...
    }
}

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

我希望问题足够清楚。

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

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

RegisterCommands被调用时,mock将执行您的私有方法

我可能是错的,但我认为方法"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())

最新更新