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

时间:2015-01-15 20:40:34

标签: delphi vcl

现在,我正在为一个来自TFrame的班级写一个单元测试...

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

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的原因。

但是现在我遇到了以下问题:异常EInvalidoperation:'元素没有父窗口'。

上面的TFrameClass在生产应用程序中工作,但它在测试应用程序中引发了异常。

是否有可能让这项工作得以保持SUT(被测系统)成为TFrame的一个阶级?

1 个答案:

答案 0 :(得分:2)

我自己找到了答案......

没有spring4d也不是真正的dunitx问题......

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

在控制台应用程序中,Application.Handle为0 ...这就是为什么TFrame无法获得句柄...

所以,我使用了一点hack(我可以接受非生产测试应用程序):

Application.Handle := GetConsoleWindow;

在主(* .dpr)单元中。

然后,它有效。