Sto provando a eseguire un test della GUI unitamente a DUnit a un'applicazione la cui forma principale crea dinamicamente fotogrammi su se stessa. Sono stato in grado di creare la maschera principale dell'applicazione-test come modulo nel caso di test e accedere alle sue voci di menu ecc.Test DUnit GUI: Posso forzare "Applicazione" su un "modulo" diverso?
Il problema si presenta quando l'applicazione tenta di creare un frame in modo dinamico. La lettura delle risorse del frame arriva al punto in cui è necessario l'handle della finestra (nel mio caso, l'impostazione della didascalia di un foglio di tabulazione). Qui va da TWinControl.GetHandle a TWinControl.CreateWnd e a TCustomFrame.CreateParams.
In questo CreateParams, il codice dice:
if Parent = nil then
Params.WndParent := Application.Handle;
Questo è dove si verifica la differenza. Quando eseguo l'applicazione effettiva (non nel test), Application.Handle restituisce un numero diverso da zero e il flusso continua ok. Ma nella applicazione di test dunit, l'Application.Handle qui restituisce 0. Questo fa sì che il codice nella TWinControl.CreateWnd di sollevare un'eccezione dicendo che il telaio non ha un genitore:
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]);
mi piacerebbe cercare di aggirare questo problema (e in generale, tutti i problemi di test) senza modificare il codice di "produzione" solo a causa dei test. Potete fornire qualche indizio sul fatto che potrei in qualche modo forzare la "Applicazione" a qualcos'altro, o in qualche altro modo aggirare questo?
Guardando il codice, un possibile altro scenario alternativo potrebbe essere quello di provare ad ottenere il proprietario (che è il mio "MainForm" dell'applicazione da testare, cioè di chi manterrà il destinatario) in csStatando lo stato durante la creazione di questo frame nel test, ma almeno inizialmente non sembra così semplice far sì che ciò accada.
Il tuo dpr ha un'applicazione. Inizializza? Forse questo imposta la maniglia. – mjn
Sia la mia app di test che l'effettiva applicazione hanno Application.Initialize nel loro dprs. Posso provare a scorrere le inizializzazioni per vedere se riesco a trovare un posto dove Application.Handle è impostato su qualcosa o meno. – DelphiUser
DUnit non mi sembra il migliore anche per testare una GUI. – GolezTrol