我有一个带有一个责任的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环境中注册该服务)?
我希望这个问题很清楚。
答案 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将执行您的私有方法。