2008-10-16 18 views
23

हमें wxwidgets के लिए यूनिट परीक्षण लिखने की आवश्यकता है Google टेस्ट फ्रेमवर्क का उपयोग कर एप्लिकेशन। समस्या यह है कि wxwidgets अनुप्रयोग मुख्य लूप प्रारंभ करने और दर्ज करने के लिए मैक्रो IMPLEMENT_APP (MyApp) का उपयोग करता है। यह मैक्रो int मुख्य() सहित कई फ़ंक्शंस बनाता है। Google टेस्ट फ्रेमवर्क प्रत्येक परीक्षण के लिए मैक्रो परिभाषाओं का भी उपयोग करता है।wxwidgets: मैक्रोज़ का उपयोग किये बिना और मुख्य एप्लिकेशन लूप में प्रवेश किए बिना wxApp को कैसे प्रारंभ करें?

समस्याओं में से एक हमने पाया है कि हम निम्न कोड के साथ मैक्रो की जगह सकता है, कि यह संभव, परीक्षण मैक्रो के भीतर से wxWidgets मैक्रो कॉल करने के लिए, क्योंकि पहले एक कार्यों बनाता नहीं है .. तो:

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

यह एक अच्छा प्रतिस्थापन है, लेकिन wxEntry() कॉल मूल एप्लिकेशन लूप में प्रवेश करती है। अगर हम wxEntry() को कॉल नहीं करते हैं तो अभी भी एप्लिकेशन के कुछ हिस्सों को प्रारंभ नहीं किया गया है।

प्रश्न यह है कि wxApp चलाने के लिए आवश्यक सभी चीज़ों को प्रारंभ करने के लिए, वास्तव में इसे चलाने के बिना, ताकि हम इकाई परीक्षण परीक्षण कर सकें?

उत्तर

4

आप समारोह का उपयोग करना चाहते:

bool wxEntryStart(int& argc, wxChar **argv) 
wxEntry के बजाय

। यह आपके ऐप के ऑनइनिट() को कॉल नहीं करता है या मुख्य लूप चलाता है।

आप अपने परीक्षणों में आवश्यक होने पर OnInit() को आमंत्रित करने के लिए wxTheApp->CallOnInit() पर कॉल कर सकते हैं।

आप

void wxEntryCleanup() 

उपयोग करने के लिए यह करने के बाद की आवश्यकता होगी।

+0

असल में, यह काम नहीं करता है। आवेदन अभी भी –

+0

शुरू नहीं हुआ है क्या आप "प्रारंभ नहीं" के बारे में अधिक विशिष्ट हो सकते हैं? यदि आप स्रोत कोड पढ़ते हैं, तो आप देखेंगे कि wxEntry वास्तव में wxEntryStart() को आमंत्रित करने से कहीं अधिक नहीं करता है और फिर "ऑनइनिट()" और "ऑनरुन()" को कॉल करता है। मुझे लगता है कि आप अपने परीक्षणों में मैन्युअल रूप से OnInit() को कॉल करना चाहते हैं। – kbluck

+0

ठीक है, यह कुछ है जो मुझे याद आया - OnInit()। मैं इसे आजमाऊंगा। –

-1

आप संभवतः स्थिति बदल सकती है चारों ओर:

प्रारंभ और मुख्य लूप सहित wxPython अनुप्रयोग शुरू करते हैं, तो अनुप्रयोग के भीतर से इकाई परीक्षण चलाते हैं। मुझे लगता है कि सभी लूट प्रविष्टि के बाद मुख्य लूप एंट्री पर एक फ़ंक्शन होता है।

+0

लक्ष्य एप्लिकेशन –

+0

साथ केन्द्र शासित प्रदेशों जब तक आप पूरा init करने के लिए एक रास्ता खोजने (और अब तक किसी ने भी एक व्यवहार्य समाधान का सुझाव दिया) लक्ष्य है कि था, केन्द्र शासित प्रदेशों के साथ आवेदन का परीक्षण करने के लिए नहीं है उपर्युक्त टिप्पणी में कहा गया है कि इस तरह से हासिल किया जा सकता है। मैंने पहले ही wxPython में समान चीजें की हैं। – Ber

+0

मेरे द्वारा +1, इस तरह मैंने समस्या को हल करने की कोशिश करने के बाद wxwidgets में अपने परीक्षण कैसे किए। – SteveL

-2

क्या आपने IMPLEMENT_APP_NO_MAIN मैक्रो की कोशिश की है? मैक्रो परिभाषा के ऊपर प्रदान की गई टिप्पणी से पता चलता है कि यह वही कर सकता है जो आपको चाहिए।

< से wxWidgets 'स्रोत निर्देशिका > \ \ 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()); } 
+0

यह मैक्रो वास्तव में प्रश्न में कोड की पहली दो पंक्तियों में कम हो गया है। समस्या यह है कि wxEntry() को कॉल करने से पहले wxApp के कुछ हिस्सों को अभी भी प्रारंभ नहीं किया गया है। wxEntry() ऐप लूप में प्रवेश करता है और नियंत्रण wxwidgets को पास किया जाता है। मैं इसे चलाने के बिना wxApp init करना चाहता हूँ। –

10

बस 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 घटकों को कार्य करने के लिए ईवेंट की डिलीवरी की आवश्यकता होती है। मुख्य लूप दर्ज करने के बाद सामान्य परीक्षण यूनिट परीक्षण चलाने के लिए होगा।

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" // 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(); 
} 
2
IMPLEMENT_APP_NO_MAIN(MyApp); 
IMPLEMENT_WX_THEME_SUPPORT; 

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

    return 0; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे