wxWidgets: Comment initialiser wxApp sans l'aide des macros et sans entrer dans la boucle principale de l'application?
Nous avons besoin d'écrire des tests unitaires pour un wxWidgets application à l'aide de Google Framework de Test.
Le problème est que wxWidgets utilise la macro IMPLEMENT_APP(MyApp) d'initialiser et d'entrer dans la boucle principale de l'application. Cette macro crée plusieurs fonctions, notamment la int main(). Le google test framework utilise également des définitions de macros pour chaque test.
L'un des problèmes est qu'il n'est pas possible d'appeler la wxWidgets macro à partir de la macro de test, parce que le premier crée fonctions.. Donc, nous avons constaté que nous pourrions remplacer la macro avec le code suivant:
wxApp* pApp = new MyApp();
wxApp::SetInstance(pApp);
wxEntry(argc, argv);
C'est un bon remplaçant, mais wxEntry() qui pénètre dans l'application d'origine de la boucle. Si nous ne les appelons pas wxEntry() il y a encore certaines parties de la demande n'est pas initialisé.
La question est de savoir comment initialiser tout le nécessaire pour un wxApp à exécuter, sans réellement l'exécuter, nous sommes donc en mesure de test de l'unité des portions de celui-ci?
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez utiliser la fonction:
au lieu de wxEntry. Il ne demande pas de votre application OnInit() ou d'exécuter la boucle principale.
Vous pouvez appeler
wxTheApp->CallOnInit()
d'invoquer OnInit() en cas de besoin dans vos tests.Vous aurez besoin d'utiliser
lorsque vous avez terminé.
Simplement été par moi-même avec 2.8.10. La magie est présente:
Vous suffit de créer un wxApp exemple, plutôt que d'obtenir votre propre classe en utilisant la technique ci-dessus.
Je ne suis pas sûr de savoir comment vous attendez-vous à faire de l'unité de test de votre application sans entrer dans le mainloop comme beaucoup de wxWidgets composants exiger la livraison des événements de la fonction. L'approche habituelle est de lancer les tests unitaires après être entré dans la boucle principale.
Il ressemble à la réalisation des essais dans le wxApp::OnRun() la fonction peut peut-être travailler.
Voici le code qui teste une boîte de dialogue de titre avec cppUnitLite2.
Vous pourriez peut-être renverser la situation:
Initialiser et lancer le wxPython application, y compris la boucle principale, puis exécuter les tests unitaires à partir de l'application. Je pense qu'il y a une fonction appelée lors de la boucle principale de l'entrée, après tout init truc est fait.
Avez-vous essayé le
IMPLEMENT_APP_NO_MAIN
macro? L'observation à la condition ci-dessus la définition de la macro suggère qu'il pourrait faire ce dont vous avez besoin.De <wxWidgets' source dir>\include\wx.h: