delphi - 如何在不注册类类型的情况下使用 Spring 的 DI 容器模拟接口(interface)?

标签 delphi mocking delphi-xe3 spring4d

我正在尝试解耦现有代码以便能够对其进行单元测试。我引入了接口(interface)来消除对 UI 对象的依赖。问题是 Spring 容器的 RegisterComponent 调用需要 TComponentType 参数,因此无法调用 RegisterComponent 必须调用 RegisterType.Implements这意味着我必须使用 DUnit 中包含进度条类定义的单元,这违背了将 DIContainer 与 ServiceLocater 配合使用来在我需要进度条时请求进度条的目的。

我不想手动创建模拟类并实现接口(interface)。有没有办法使用Delphi.Mocks自动模拟接口(interface)而不指定实现类?

最佳答案

您显然没有使用最新版本的 Spring4D,因为此功能已于去年 11 月实现(请参阅 https://stackoverflow.com/a/11315141/587106 中的更新)

目前还没有容器的自动模拟功能,但我喜欢这个想法,并将考虑实现一些使这变得更容易的东西(可能通过改进容器扩展)。

目前测试用例方法如下所示(使用 DSharp 模拟语法):

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 有许多依赖项,使得容器的使用很有吸引力,这通常是违反某些设计原则的标志。

关于delphi - 如何在不注册类类型的情况下使用 Spring 的 DI 容器模拟接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067655/

相关文章:

德尔福。反转光标颜色

php - 如何在 PHP 单元测试中模拟在构造函数中调用的方法?

delphi - 为什么我的 Delphi Service App 没有启动?

delphi - Microsoft AlwaysOn 故障转移解决方案和 Delphi

delphi - 模块 'project.exe' 中地址 004EAE10 处的访问冲突写入地址 00000004'

Delphi XE4 我必须包含什么才能使用函数 FmxHandleToObjC

delphi - 为什么不可见组件不会触发 OnUpdate

ios - 在 Storyboard 中定义的模拟 UIViewController

android - Robolectric (Android) : Using ShadowLocationManager ? 是否可配置?

delphi - 如何在 RadStudio XE3 选项中关联 .dpr 扩展名?