Estoy tratando de ejecutar una prueba de unidad GUI con DUnit a una aplicación cuya forma principal crea dinámicamente tramas consigo mismo. Pude crear la forma principal de la aplicación como prueba en el formulario de prueba y acceder a sus elementos de menú, etc.Prueba DUnit GUI: ¿Puedo forzar 'Aplicación' a una "forma" diferente?
El problema surge cuando la aplicación intenta crear un marco de forma dinámica. La lectura de recursos del marco llega a un punto donde necesita el identificador de ventana (en mi caso, establecer el título de una hoja de pestaña). Aquí va de TWinControl.GetHandle a TWinControl.CreateWnd y a TCustomFrame.CreateParams.
En esta CreateParams, el código dice:
if Parent = nil then
Params.WndParent := Application.Handle;
Aquí es donde se produce la diferencia. Cuando ejecuto la aplicación real (no en la prueba), Application.Handle aquí devuelve un número distinto de cero y el flujo continúa bien. Sin embargo, en la aplicación de prueba DUnit, la Application.Handle aquí devuelve 0. Esto hace que el código en el TWinControl.CreateWnd a lanzar una excepción diciendo que el marco no tiene un padre:
with Params do
begin
if (WndParent = 0) and (Style and WS_CHILD <> 0) then
if (Owner <> nil) and (csReading in Owner.ComponentState) and
(Owner is TWinControl) then
WndParent := TWinControl(Owner).Handle
else
raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
me gustaría intente evitar este problema (y, en general, todos los problemas de prueba) sin modificar el código de "producción" solo por las pruebas. ¿Puede proporcionar alguna pista sobre si de alguna manera podría forzar la "Aplicación" a otra cosa, o de alguna otra manera solucionar este problema?
Al mirar el código, un posible otro escenario de solución podría ser intentar que el propietario (que es mi "MainForm" de la aplicación a prueba, es decir, cuyo identificador me gustaría tener) esté en csLectura de estado mientras se realiza esta creación de cuadro en la prueba, pero al menos inicialmente tampoco parece tan sencillo lograr que esto suceda.
¿Tiene su dpr una aplicación.Inicializar? Tal vez esto establezca el control. – mjn
Tanto mi aplicación de prueba como la aplicación real tienen la aplicación. Inicialice en sus dprs. Puedo tratar de pasar por las inicializaciones para ver si puedo encontrar un lugar donde Application.Handle está establecido en algo o no. – DelphiUser
DUnit me parece que no es el mejor para probar una GUI. – GolezTrol