what tutorial libreria instalar c++ unit-testing wxwidgets googletest

c++ - tutorial - wxWidgets: ¿cómo inicializar wxApp sin usar macros y sin ingresar el bucle principal de la aplicación?



wxwidgets libreria manual (6)

Necesitamos escribir pruebas unitarias para una aplicación wxWidgets usando Google Test Framework . El problema es que wxWidgets usa la macro IMPLEMENT_APP (MyApp) para inicializar e ingresar el bucle principal de la aplicación. Esta macro crea varias funciones incluyendo int main () . El marco de prueba de google también usa definiciones de macro para cada prueba.

Uno de los problemas es que no es posible llamar a la macro wxWidgets desde la macro de prueba, porque la primera crea funciones ... Entonces, encontramos que podríamos reemplazar la macro con el siguiente código:

wxApp* pApp = new MyApp(); wxApp::SetInstance(pApp); wxEntry(argc, argv);

Es un buen reemplazo, pero la llamada a wxEntry () ingresa al bucle de la aplicación original. Si no llamamos a wxEntry () todavía hay algunas partes de la aplicación no inicializadas.

La pregunta es cómo inicializar todo lo que se requiere para ejecutar una wxApp, sin ejecutarlo realmente, entonces, ¿podemos probar porciones de la misma?


Parece que hacer las pruebas en la función wxApp :: OnRun () quizás funcione. Aquí hay un código que prueba el título de un diálogo con cppUnitLite2.

#include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wx/app.h" // use square braces for wx includes: I made quotes to overcome issue in HTML render #include "wx/Frame.h" #include "../CppUnitLite2/src/CppUnitLite2.h" #include "../CppUnitLite2/src/TestResultStdErr.h" #include "../theAppToBeTested/MyDialog.h" TEST (MyFirstTest) { // The "Hello World" of the test system int a = 102; CHECK_EQUAL (102, a); } TEST (MySecondTest) { MyDialog dlg(NULL); // instantiate a class derived from wxDialog CHECK_EQUAL ("HELLO", dlg.GetTitle()); // Expecting this to fail: title should be "MY DIALOG" } class MyApp: public wxApp { public: virtual bool OnInit(); virtual int OnRun(); }; IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { return true; } int MyApp::OnRun() { fprintf(stderr, "====================== Running App Unit Tests =============================/n"); if ( !wxApp::OnInit() ) return false; TestResultStdErr result; TestRegistry::Instance().Run(result); fprintf(stderr, "====================== Testing end: %ld errors =============================/n", result.FailureCount() ); return result.FailureCount(); }


Posiblemente podrías cambiar la situación:

Inicialice e inicie la aplicación wxPython, incluido el ciclo principal, luego ejecute las pruebas unitarias desde la aplicación. Creo que hay una función llamada en la entrada del bucle principal, después de que todo lo de init haya terminado.


¿Has probado la macro IMPLEMENT_APP_NO_MAIN ? El comentario proporcionado arriba de la definición macro sugiere que podría hacer lo que usted necesita.

Desde el <directorio de origen de wxWidgets> / include / wx.h:

// Use this macro if you want to define your own main() or WinMain() function // and call wxEntry() from there. #define IMPLEMENT_APP_NO_MAIN(appname) / wxAppConsole *wxCreateApp() / { / wxAppConsole::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, / "your program"); / return new appname; / } / wxAppInitializer / wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp); / DECLARE_APP(appname) / appname& wxGetApp() { return *wx_static_cast(appname*, wxApp::GetInstance()); }


Desea usar la función:

bool wxEntryStart(int& argc, wxChar **argv)

en lugar de wxEntry. No llama a OnInit () de su aplicación ni ejecuta el ciclo principal.

Puede llamar a wxTheApp->CallOnInit() para invocar OnInit () cuando sea necesario en sus pruebas.

Tendrás que usar

void wxEntryCleanup()

cuando termines.


Acabo de atravesar esto yo mismo con 2.8.10. La magia es esta:

// MyWxApp derives from wxApp wxApp::SetInstance( new MyWxApp() ); wxEntryStart( argc, argv ); wxTheApp->OnInit(); // you can create top level-windows here or in OnInit() ... // do your testing here wxTheApp->OnRun(); wxTheApp->OnExit(); wxEntryCleanup();

Puede crear una instancia de wxApp en lugar de derivar su propia clase utilizando la técnica anterior.

No estoy seguro de cómo espera hacer pruebas unitarias de su aplicación sin ingresar al bucle principal, ya que muchos componentes wxWidgets requieren la entrega de eventos para funcionar. El enfoque habitual sería ejecutar pruebas unitarias luego de ingresar al ciclo principal.


IMPLEMENT_APP_NO_MAIN(MyApp); IMPLEMENT_WX_THEME_SUPPORT; int main(int argc, char *argv[]) { wxEntryStart( argc, argv ); wxTheApp->CallOnInit(); wxTheApp->OnRun(); return 0; }