27

Google Test Frameworkを使用して、 wxWidgetsアプリケーションの単体テストを作成する必要があります。問題は、wxWidgetsがマクロIMPLEMENT_APP(MyApp)を使用して、アプリケーションのメインループを初期化して開始することです。このマクロは、int main()を含むいくつかの関数を作成します。googleテストフレームワークは、各テストにマクロ定義も使用します。

問題の1つは、最初のマクロが関数を作成するため、テストマクロ内からwxWidgetsマクロを呼び出すことができないことです。したがって、マクロを次のコードに置き換えることができることがわかりました。

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

これは良い代替品ですが、wxEntry()呼び出しは元のアプリケーションループに入ります。wxEntry()を呼び出さない場合でも、アプリケーションの一部が初期化されていません。

問題は、wxAppを実際に実行せずに実行するために必要なすべてを初期化して、その一部を単体テストできるようにする方法です。

4

6 に答える 6

16

2.8.10でこれを経験しました。魔法はこれです:

// MyWxApp derives from wxApp
wxApp::SetInstance( new MyWxApp() );
wxEntryStart( argc, argv );
wxTheApp->CallOnInit();

// you can create top level-windows here or in OnInit()
...
// do your testing here

wxTheApp->OnRun();
wxTheApp->OnExit();
wxEntryCleanup();

上記の手法を使用して独自のクラスを派生させるのではなく、wxApp インスタンスを作成するだけです。

多くの wxWidgets コンポーネントが機能するためにイベントの配信を必要とするため、メインループに入ることなくアプリケーションの単体テストを行う方法がわかりません。通常のアプローチは、メイン ループに入った後に単体テストを実行することです。

于 2009-05-28T12:01:04.293 に答える
9
IMPLEMENT_APP_NO_MAIN(MyApp);
IMPLEMENT_WX_THEME_SUPPORT;

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

    return 0;
}
于 2013-10-10T12:35:05.750 に答える
5

関数を使用したい:

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

wxEntry の代わりに。アプリの OnInit() を呼び出したり、メイン ループを実行したりしません。

wxTheApp->CallOnInit()テストで必要なときに OnInit() を呼び出して呼び出すことができます。

使用する必要があります

void wxEntryCleanup()

あなたが終わったら。

于 2008-10-17T16:55:45.857 に答える
1

wxApp::OnRun() 関数でテストを実行すると、おそらくうまくいくようです。ダイアログのタイトルを cppUnitLite2 でテストするコードを次に示します。

 
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif
#include "wx/app.h" // wx インクルードには角括弧を使用します: HTML レンダリングの問題を克服するために引用符を作成しました
#include "wx/Frame.h"
#include "../CppUnitLite2\src/CppUnitLite2.h"
#include "../CppUnitLite2\src/TestResultStdErr.h"
#include "../theAppToBeTested/MyDialog.h"
 テスト (MyFirstTest)
{
    // テスト システムの「Hello World」
    int a = 102;
    CHECK_EQUAL (102、a);
}

 テスト (MySecondTest)
 {
    MyDialog dlg(NULL); // wxDialog から派生したクラスをインスタンス化します
    CHECK_EQUAL ("こんにちは", dlg.GetTitle()); // これが失敗することが予想されます: タイトルは "MY DIALOG" である必要があります
 }

クラス MyApp: public wxApp
{
公衆:
    仮想ブール OnInit();
    仮想 int OnRun();
};

IMPLEMENT_APP(マイアプリ)

bool MyApp::OnInit()
{   
    true を返します。
}

int MyApp::OnRun()
{
    fprintf(stderr, "====================== アプリ単体テストの実行 =================== ==========\n");
    if ( !wxApp::OnInit() )
        false を返します。

    TestResultStdErr 結果;
    TestRegistry::Instance().Run(結果);   
    fprintf(stderr, "====================== テスト終了: %ld エラー ================= ============\n", result.FailureCount() );

    結果を返す.FailureCount();
}
于 2011-04-15T14:33:36.470 に答える
-1

IMPLEMENT_APP_NO_MAINマクロは試しましたか?マクロ定義の上にあるコメントは、必要なことを実行する可能性があることを示唆しています。

<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()); }
于 2008-10-17T00:27:59.267 に答える
-1

あなたはおそらく状況を好転させることができます:

メイン ループを含む wxPython アプリを初期化して開始し、アプリ内から単体テストを実行します。すべての初期化作業が完了した後、メインループのエントリ時に呼び出される関数があると思います。

于 2008-10-16T18:42:22.753 に答える