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

时间:2013-06-19 09:48:04

标签: c# unit-testing rhino-mocks

我有一个带有一个责任的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环境中注册该服务)?

我希望这个问题很清楚。

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:1)

您可以使用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将执行您的私有方法。