我正在尝试将现有代码分离,以便对其进行单元测试。我已经介绍了删除UI对象依赖的接口。问题是Spring容器的RegisterComponent< T> call需要一个TComponentType参数,所以我不能调用RegisterComponent< IMyProgressBar>我必须调用RegisterType< TMyProgressBar>。实施< IMyProgressBar>这意味着我必须在DUnit中使用包含progressbar类定义的单元,这违背了与ServiceLocater一起使用DIContainer以在需要时请求进度条的目的。
我不想创建模拟类并手动实现接口。有没有办法使用Delphi.Mocks自动模拟接口而不指定实现类?
答案 0 :(得分:3)
您显然不使用最新版本的Spring4D,因为此功能已于去年11月实施(请参阅https://stackoverflow.com/a/11315141/587106中的更新)
目前没有自动模拟容器,但我喜欢这个想法,并将研究实现使这更容易的东西(可能通过改进容器扩展)。
目前,测试用例方法看起来像这样(使用DSharp mocks语法):
procedure TMyTestCase.TestSomething;
var
progressBarMock: Mock<IProgressBar>;
sut: TTestComponent;
begin
container.RegisterType<TTestComponent>;
container.RegisterType<IProgressBar>.DelegateTo(
function: IProgressBar
begin
Result := progressBarMock;
end);
container.Build;
// mock setup
sut := container.Resolve<TTestComponent>;
// perform test
end;
无论如何,我强烈建议在不使用DI容器的情况下编写单元测试。
如果您的SUT有许多依赖关系,那么使用容器很有吸引力,这往往是违反某些设计原则的标志。