现在,我正在为一个来自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的一个阶级?
答案 0 :(得分:2)
我自己找到了答案......
没有spring4d也不是真正的dunitx问题......
只是,你通常无法在控制台应用程序(我的测试应用程序是)中创建一个框架。
在控制台应用程序中,Application.Handle为0 ...这就是为什么TFrame无法获得句柄...
所以,我使用了一点hack(我可以接受非生产测试应用程序):
Application.Handle := GetConsoleWindow;
在主(* .dpr)单元中。
然后,它有效。