在单元测试(以及控制台)应用程序中创建 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) 单元中。
然后,它起作用了。
现在,我正在为 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) 单元中。
然后,它起作用了。