WXWIDGETS : 매크로를 사용하지 않고 기본 애플리케이션 루프를 입력하지 않고 WXAPP를 초기화하는 방법은 무엇입니까?

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

문제

우리는 단위 테스트를 작성해야합니다 wxwidgets 응용 프로그램 사용 Google 테스트 프레임 워크. 문제는 그 것입니다 wxwidgets 매크로를 사용합니다 구현 _app (myapp) 애플리케이션 메인 루프를 초기화하고 입력합니다. 이 매크로는 다음을 포함한 여러 기능을 만듭니다 int main (). 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 앱을 초기화하고 시작한 다음 앱 내에서 장치 테스트를 실행하십시오. 모든 Init 작업이 완료된 후 메인 루프 항목에 호출되는 기능이 있다고 생각합니다.

당신은 시도 했습니까? IMPLEMENT_APP_NO_MAIN 매크로? 매크로 정의 위에 제공된 의견은 필요한 일을 할 수 있음을 시사합니다.

에서u003CwxWidgets' source 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