在单元测试(以及控制台)应用程序中创建 TFrame 时的 EInvalidOperation(无父 window)

EInvalidOperation (no parent window) when creating a TFrame in a unit-testing (and therefore console) application

现在,我正在为 TFrame 派生的 class...

编写单元测试

在我的设置方法中,我得到了以下代码:

procedure TestFixtureClass.Setup;
begin
    FTestContainer := TContainer.Create;

    FTestContainer.RegisterType<TframeClass, TframeClass>
        .Implements<IFrameClass>
        .AsSingleton(TRefCounting.True)
        .DelegateTo(function: TframeClass 
            begin
                // also tried: TframeClass.Create(Application);
                // and: form1 := TForm1.Create(Application); TframeClass.Create(form1);
                Result := TframeClass.Create(nil);
            end)
        .AsDefault;

    FTestContainer.Build;

    FSut := FTestContainer.Resolve<IFrameClass>;  // Exception here
end;

TframeClass 有引用计数(类似于 TInterfacedObject),这就是我在 AsSingleton 中使用 TRefCounting.True 的原因。

但现在我遇到了以下问题:Exception EInvalidoperation: 'Element has no parent window'.

上述 TFrameClass 在生产应用程序中有效,但在测试应用程序中引发异常。

是否有可能完成这项工作,使 SUT(被测系统)保持 TFrame 派生 class?

我自己找到了答案...

这不是 spring4d 也不是真正的 dunitx 问题...

只是,您通常无法在控制台应用程序(我的测试应用程序是)中创建框架。

在控制台应用程序中,Application.Handle 为 0...这就是 TFrame 无法获取句柄的原因...

因此,我使用了一些 hack(对于非生产测试应用程序我可以接受):

Application.Handle := GetConsoleWindow;

在主 (*.dpr) 单元中。

然后,它起作用了。