2012-02-22 20 views
6

मैं एक आवेदन जिसका MainForm गतिशील बनाता है खुद को फ्रेम करने के लिए DUnit साथ एक जीयूआई इकाई परीक्षण चलाने के लिए कोशिश कर रहा हूँ। मैं टेस्ट केस में फॉर्म के रूप में एप्लिकेशन-टू-टेस्ट के मुख्य प्रारूप को बनाने और इसके मेनू आइटम आदि तक पहुंचने में सक्षम हूं।डुनिट जीयूआई परीक्षण: क्या मैं 'एप्लिकेशन' को एक अलग "फॉर्म" पर मजबूर कर सकता हूं?

समस्या तब होती है जब एप्लिकेशन गतिशील रूप से फ्रेम बनाने की कोशिश करता है। फ्रेम का संसाधन पढ़ने एक बिंदु पर आता है जहां इसे विंडो हैंडल की आवश्यकता होती है (मेरे मामले में, टैब शीट का कैप्शन सेट करना)। यहां यह TWinControl.GetHandle से TWinControl.CreateWnd और TCustomFrame.CreateParams से जाता है।

इस CreateParams में, कोड का कहना है:

if Parent = nil then 
    Params.WndParent := Application.Handle; 

यह जहां अंतर होता है। जब मैं वास्तविक एप्लिकेशन (परीक्षण में नहीं) चलाता हूं, तो एप्लिकेशन। यहां हैडल एक गैर-शून्य संख्या देता है और प्रवाह ठीक रहता है। लेकिन DUnit परीक्षण आवेदन में, Application.Handle यहाँ रिटर्न 0. यह कह रही है कि फ्रेम एक जनक नहीं है एक अपवाद को बढ़ाने के लिए TWinControl.CreateWnd में कोड का कारण बनता है:

with Params do 
    begin 
    if (WndParent = 0) and (Style and WS_CHILD <> 0) then 
     if (Owner <> nil) and (csReading in Owner.ComponentState) and 
     (Owner is TWinControl) then 
     WndParent := TWinControl(Owner).Handle 
     else 
     raise EInvalidOperation.CreateFmt(SParentRequired, [Name]); 

मैं चाहते हैं परीक्षणों के कारण "उत्पादन" कोड को संशोधित किए बिना इस समस्या (और सामान्य रूप से, सभी परीक्षण समस्याओं) को पाने का प्रयास करें। क्या आप किसी भी तरह के संकेतों को किसी भी तरह से "एप्लिकेशन" को किसी अन्य चीज़ पर मजबूर कर सकते हैं, या किसी अन्य तरीके से इस पर काम कर सकते हैं?

कोड को देखते हुए, मालिक को प्राप्त करने का प्रयास करने के लिए एक संभावित अन्य कामकाज परिदृश्य हो सकता है (जो मेरा "मेनफॉर्म" एप्लिकेशन-टू-टेस्ट है, यानी जिसका संभाल मैं प्राप्त करना चाहता हूं) परीक्षण में इस फ्रेम निर्माण करते समय राज्य को पढ़ना, लेकिन कम से कम शुरुआत में ऐसा होने के लिए यह इतना सरल नहीं लगता है।

+0

क्या आपके डीआरपी के पास आवेदन है। आरंभ करें? शायद यह हैंडल सेट करता है। – mjn

+0

मेरे टेस्ट-ऐप और वास्तविक ऐप दोनों में एप्लिकेशन है। अपने डीपीआर में शुरू करें। मैं यह देखने के लिए शुरूआत के माध्यम से कदम उठाने का प्रयास कर सकता हूं कि क्या मुझे एक जगह मिल सकती है जहां आवेदन। हैंडल कुछ पर सेट है या नहीं। – DelphiUser

+0

डुनीट मुझे जीयूआई का परीक्षण करने के लिए सबसे अच्छा नहीं लगता है। – GolezTrol

उत्तर

0

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

मैं एक परीक्षण डेकोरेटर वर्ग TTestSetup है, जो कि यह बनाता है जब आवश्यक एक डमी (मुख्य) फार्म के लिए एक संदर्भ रखती से इनहेरिट की है। http://www.swissdelphicenter.ch/torry/showcode.php?id=665

परीक्षण डेकोरेटर सेटअप विधि में मैं पहली बार डमी प्रपत्र बनाने और उसके बाद आवेदन का मुख्य रूप के रूप में सेट:

मैं भी इस तरह दृष्टिकोण का उपयोग क्रम पर Application.MainForm स्विच करने के लिए एक रास्ता मिल गया (यह सेटिंग यहां आवश्यक नहीं हो सकती है)।

तो मैं एक परीक्षण का मामला वर्ग (TGUITestCase से इनहेरिट), जिसका सेटअप और टियरडाउन प्रत्येक परीक्षा के लिए चलाए जा रहे हैं की है। इस सेटअप में मैं मुख्य प्रारूप बना रहा हूं जिसे मैं परीक्षण कर रहा हूं और फिर इसे एप्लिकेशन के मुख्य रूप के रूप में सेट करता हूं। फिर टेस्ट केस के टियरडाउन में परीक्षण के बाद, मैंने डमी फॉर्म को एप्लिकेशन का मुख्य रूप बनने के लिए सेट किया, और केवल इस कॉल के बाद मैं जिस मुख्य प्रारूप का परीक्षण कर रहा हूं उसे बंद करें और निशुल्क। अन्यथा एक फॉर्म को मुक्त करना जो वर्तमान में आवेदन है। मेनफॉर्म पूरे डीयूनिट एप्लिकेशन को समाप्त कर देगा।

+0

हालांकि यह आपके लिए काम करता है, यह अभी भी TFrames का गलत उपयोग है। –

2
इसके बजाय Application.Handle स्थापित करने के लिए एक तरह से चारों ओर काम करने का

, आप एक TForm बनाने के लिए, और अपने frame.parent सेट कि TForm होने के लिए करना चाहिए।

//Dunit Test Scaffolding code...Set up a workable environment for the test: 
aForm := TForm.Create(nil); 
aFrame := TFrame.Create(aForm); 
aFrame.Parent := aForm; 

असली ऐप्स में, फ्रेम एक माता पिता होगा (एक खिड़की, एक TForm या TPanel आमतौर पर करने के लिए parented जा सकती है)। आप माता-पिता के बिना चलाने के लिए एक फ्रेम बताने की कोशिश कर रहे हैं, जिसे TFrame करने के लिए डिज़ाइन नहीं किया गया है।

+0

असल में, मैं माता-पिता के बिना चलाने के लिए एक फ्रेम बताने की कोशिश नहीं कर रहा हूं, बस इसे बनाएं। मेरे असली एप्लिकेशन में फ्रेम मुख्य रूप से मालिक के रूप में मुख्य रूप से बनाए जाते हैं। फिर बाद में जब कुछ चयन किए जाते हैं, तो चयन के आधार पर एक उपयुक्त फ्रेम चुना जाता है और फिर इस फ्रेम को मुख्य रूप में पैनल के रूप में अपने माता-पिता के रूप में सेट किया जाता है। इस प्रकार, सभी फ्रेम एक ही माता-पिता के साथ प्रदर्शित होंगे, एक समय में, लेकिन अग्रिम में बनाया गया था। यह सब मेरे उत्पादन कोड के भीतर होता है, जिसे मैं सिर्फ परीक्षण के लिए नहीं बदलना चाहता हूं। – DelphiUser

+0

मुझे नहीं लगता कि टीएफआरएम इस काम को करने की अनुमति देने के लिए डिज़ाइन किया गया है। आपको सीमा के बिना फॉर्म बनाने और डॉक करना चाहिए, और आपको ऐसी समस्याएं नहीं होंगी। आपके मामले में एक फ्रेम बनाने में यह शून्य लाभ है। –

+0

फ़्रेम का उपयोग करते समय, मुझे किसी भी डॉकिंग समस्या पर विचार करने की आवश्यकता नहीं है, इसलिए कम से कम मेरे लिए एक गैर-शून्य लाभ है। – DelphiUser