我有一个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())