أدوات wx:كيفية تهيئة wxApp دون استخدام وحدات الماكرو ودون الدخول إلى حلقة التطبيق الرئيسية؟

StackOverflow https://stackoverflow.com/questions/208373

سؤال

نحن بحاجة إلى كتابة اختبارات الوحدة ل wxWidgets التطبيق باستخدام إطار اختبار جوجل.المشكلة هي wxWidgets يستخدم الماكرو IMPLEMENT_APP(MyApp) لتهيئة وإدخال الحلقة الرئيسية للتطبيق.يقوم هذا الماكرو بإنشاء العديد من الوظائف بما في ذلك انت مين().يستخدم إطار اختبار Google أيضًا تعريفات الماكرو لكل اختبار.

إحدى المشكلات هي أنه لا يمكن استدعاء الماكرو wxWidgets من داخل ماكرو الاختبار، لأن الأول ينشئ وظائف..لذلك وجدنا أنه يمكننا استبدال الماكرو بالكود التالي:

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

يعد هذا بديلاً جيدًا، لكن استدعاء wxEntry() يدخل في حلقة التطبيق الأصلية.إذا لم نستدعي wxEntry() فلا تزال هناك بعض أجزاء التطبيق لم تتم تهيئتها.

والسؤال هو كيفية تهيئة كل ما هو مطلوب لتشغيل wxApp، دون تشغيله فعليًا، حتى نتمكن من اختبار أجزاء منه؟

هل كانت مفيدة؟

المحلول

تريد استخدام الوظيفة:

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

بدلاً من wxEntry.ولا يقوم باستدعاء OnInit() الخاص بتطبيقك أو تشغيل الحلقة الرئيسية.

تستطيع الاتصال wxTheApp->CallOnInit() لاستدعاء OnInit() عند الحاجة في اختباراتك.

سوف تحتاج إلى استخدام

void wxEntryCleanup()

حينما تنتهي.

نصائح أخرى

لقد مررت بهذا بنفسي مع 2.8.10.السحر هو هذا:

// 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();

يمكنك فقط إنشاء مثيل wxApp بدلاً من اشتقاق فصلك الخاص باستخدام التقنية المذكورة أعلاه.

لست متأكدًا من الطريقة التي تتوقع بها إجراء اختبار الوحدة لتطبيقك دون الدخول إلى الحلقة الرئيسية نظرًا لأن العديد من مكونات wxWidgets تتطلب تسليم الأحداث لتعمل.سيكون النهج المعتاد هو إجراء اختبارات الوحدة بعد الدخول إلى الحلقة الرئيسية.

IMPLEMENT_APP_NO_MAIN(MyApp);
IMPLEMENT_WX_THEME_SUPPORT;

int main(int argc, char *argv[])
{
    wxEntryStart( argc, argv );
    wxTheApp->CallOnInit();
    wxTheApp->OnRun();

    return 0;
}

يبدو أن إجراء الاختبارات في الدالة wxApp::OnRun() قد ينجح.إليك الكود الذي يختبر عنوان مربع الحوار باستخدام 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(); 
}

ربما يمكنك قلب الوضع:

قم بتهيئة تطبيق wxPython وبدء تشغيله بما في ذلك الحلقة الرئيسية، ثم قم بتشغيل اختبارات الوحدة من داخل التطبيق.أعتقد أن هناك وظيفة تسمى عند إدخال الحلقة الرئيسية، بعد الانتهاء من جميع العناصر الأولية.

هل حاولت IMPLEMENT_APP_NO_MAIN دقيق؟يشير التعليق المقدم أعلى التعريف الكلي إلى أنه قد يفعل ما تحتاج إليه.

من <wxWidgets' المصدر dir>\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()); }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top