FlexUnit 4 के साथ फ्लेक्स UI घटकों के लिए टेस्ट सुविधाएँ

काम के लिए, किसी तरह एक स्व-लिखित फ्लेक्स घटक के लिए कार्यक्षमता जोड़ना आवश्यक था। उसी समय, यह महत्वपूर्ण था कि पहले से मौजूद व्यवहार को न तोड़ा जाए, क्योंकि अपने अस्तित्व के दौरान, घटक का उपयोग कई अनुप्रयोगों में किया गया है और वारिस द्वारा उखाड़ दिया गया है।

इस तरह की समस्याओं को हल करने के लिए एक मानक दृष्टिकोण घटक के वर्तमान व्यवहार को कवर करने वाले इकाई परीक्षणों को शुरू करना है, जबकि अपने डिवाइस की विशेषताओं को स्वयं स्पष्ट करना है।
इसके बाद ही चरण-दर-चरण रीफैक्टरिंग और कार्यक्षमता के विस्तार को शुरू करना संभव है, अगर परिवर्तन के परिणामस्वरूप कुछ टूट गया है, तो इस विषय पर लगातार चल रहे परीक्षण। [3]

हालांकि, कार्य इस तथ्य से जटिल है कि फ्लेक्स में दृश्य घटकों में गुणन को शुरू करने और अद्यतन करने के लिए एक मल्टीफ़ेज़ अतुल्यकालिक प्रक्रिया है, और उन्हें परीक्षण लिखने के लिए विशेष साधनों की आवश्यकता होती है। FlexUnit 4 इस कार्य के साथ सामना करना आसान बनाता है, और नीचे मैं दिखाऊंगा कि यह कैसे करना है, और एक ही समय में मैं कुछ बारीकियों को प्रकट करूंगा।


UIComponent वंशजों का परीक्षण करते समय, हमें इस बात का ध्यान रखना चाहिए कि घटक की अधिकांश संपत्तियां एक अस्थिर स्थिति में हैं जब तक कि इसे प्रदर्शन सूची में नहीं जोड़ा जाता है और सभी आरंभीकरण चरणों (createChildren, commProperties, उपाय, updateDisplayList, आदि) से गुजरता है।

यदि हम इस घटना से पहले परीक्षण चलाते हैं, तो कंप्यूटर की गति और लोड के आधार पर, जिस पर परीक्षण चल रहे हैं, हम घटक को थोड़ा अलग राज्यों में प्राप्त करेंगे। इसे रोकने के लिए, हमें CREATION_COMPLETE इवेंट की प्रतीक्षा करनी चाहिए।

मान लीजिए हम एक ऐसा बटन बनाना चाहते हैं, जो न केवल दृश्यमान = गलत सेट करते समय छिपाएगा, बल्कि अन्य घटकों के स्थान को भी प्रभावित नहीं करेगा, अर्थात इसमें शामिल हैं = गलत।

<?xml version="1.0"?> <mx:Button xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ override public function set visible(value:Boolean):void { super.visible = value; invalidateProperties(); } override protected function commitProperties():void { super.commitProperties(); includeInLayout = visible; //  ,     VALUE_COMMIT //dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT)); } ]]></mx:Script> </mx:Button> 

यहाँ, आप निश्चित रूप से, InLayout = को शामिल कर सकते हैं और फ़ंक्शन में सेट दृश्य फ़ंक्शन को स्वयं ही शामिल कर सकते हैं, लेकिन मैं एक अधिक सामान्य मामला दिखाना चाहता हूं जब कई परस्पर संपत्तियां होती हैं और उन सभी को समितियों में अपडेट करने की आवश्यकता होती है।

"आंख से" सत्यापित करने के लिए कि सब कुछ हमारे लिए सही ढंग से काम कर रहा है, परीक्षण एप्लिकेशन चलाएं:
 <?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*"> <local:HidingButton id="hidingBtn" label="I'll hide"/> <mx:Button label="try me" click="hidingBtn.visible = ! hidingBtn.visible"/> </mx:Application> 


अब परीक्षण को स्वयं लिखने का प्रयास करें:

 package { import flash.events.Event; import flexunit.framework.Assert; import mx.core.Application; import mx.events.FlexEvent; import org.flexunit.asserts.assertEquals; import org.flexunit.async.Async; public class HidingButtonAsyncTest { public var myBtn:HidingButton; //       , //   [Test] [Before( async )] public function setUp():void { myBtn = new HidingButton(); //   CREATION_COMPLETE     addChild Async.proceedOnEvent(this, myBtn, FlexEvent.CREATION_COMPLETE, 1000); Application.application.addChild(myBtn); } //       , //   [Test] [After( async )] public function tearDown():void { Application.application.removeChild(myBtn); myBtn = null; } [Test(async, description="   ")] public function testDefaultState():void { assertEquals(myBtn.visible, true); assertEquals(myBtn.includeInLayout, true); } [Test(async, description=" ")] public function testHideButton():void { myBtn.addEventListener('includeInLayoutChanged', Async.asyncHandler(this, handleVerifyProperty, 100, null, handleEventNeverOccurred), false, 0, true); myBtn.visible = false; //      ,      function handleVerifyProperty(event:Event, passThroughData:Object):void { assertEquals(myBtn.includeInLayout, false); } } //  ,     private function handleEventNeverOccurred(passThroughData:Object):void { Assert.fail('Pending Event Never Occurred'); } } } 


बारीकियों

1. जैसा कि आप कोड से देख सकते हैं, मैंने यूनिकॉमपेंटेंट में शामिल श्रोता का उपयोग किया है। इसमें शामिल हैं 'इनवेंटऑनचेंजड' में आंतरिक इवेंट शामिल करने के लिए बदलाव को शामिल करें। FlexUnit प्रलेखन [1] FlexEvent.VALUE_COMMIT का उपयोग करने की सिफारिश करता है, लेकिन इसे भेजा नहीं जाता है; आपको इसे स्वयं भेजना होगा।

सबसे सामान्य मामले में, जब एक घटना को एकल करना मुश्किल होता है जिसके बाद आप गुणों की जांच कर सकते हैं, तो आप घटक को किसी अन्य अतुल्यकालिक प्रक्रिया की तरह परीक्षण कर सकते हैं: एक गारंटीकृत लंबे अंतराल के साथ एक टाइमर सेट करें। फिर हमारा परीक्षण इस तरह दोबारा लिखा जाएगा:
 [Test(async, description="   ")] public function testHideButtonWithTimer():void { var timer:Timer = new Timer(50,1); timer.addEventListener(TimerEvent.TIMER_COMPLETE, Async.asyncHandler(this, handleVerifyProperty, 100, {}, handleEventNeverOccurred), false, 0, true); myBtn.visible = false; timer.start(); function handleVerifyProperty(event:Event, passThroughData:Object):void { assertEquals(myBtn.includeInLayout, false); } } 

यदि आपको टाइमर के साथ इस तरह के कई परीक्षण करने की आवश्यकता है, तो टाइमर की प्रारंभिककरण और शून्यिंग को इसी [पहले] और [बाद] तरीकों से किया जाना चाहिए।

2. यह परीक्षण Flex Sdk 3. * के तहत लिखा गया था, यदि आप Flex।

3. Application.application में सीधे परीक्षण किए गए घटकों को जोड़ने का नुकसान यह है कि घटक परीक्षण धावक विंडो में दिखाई देता है, और यह भी कि परीक्षण धावक शैलियों आपके घटक की शैलियों को प्रभावित कर सकती हैं।
इससे बचने के लिए, FlexUnit में एक विशेष UIImpersonator वर्ग है जो प्रदर्शन सूची में एक घटक जोड़ने का अनुकरण करता है। दुर्भाग्य से, मुझे चींटी-बिल्ड में और इंटेलीज से काम करने के लिए UIImpersonator नहीं मिल सका - मुझे "अपेक्षित घटना से पहले टाइमआउट हुआ" त्रुटि मिलती है। शायद कोई आपको बताएगा कि क्यों। UIImpersonator का उपयोग कैसे करें के एक उदाहरण के लिए, नीचे दिए गए टिप्पणियों को देखें।

UPD: Intellij और ant से काम करने के लिए, आपको जुड़े पुस्तकालयों की सूची से flexunit-4.1.0-33-as3_3.5.0.12683.swc को हटाने की आवश्यकता है। यह फ्लेक्स के लिए एक समान के साथ संघर्ष करता है।

संदर्भ

1. FlexUnit द्वारा डॉक: docs.flexunit.org/index.php?title=Min_age
2. FlashBuilder से इकाई परीक्षण बनाना और चलाना: habrahabr.ru/blogs/Flash_Platform.38987
3. रिफैक्टिंग पर हैंडबुक: माइकल फेदर्स। विरासत कोड के साथ प्रभावी ढंग से काम करना।

Source: https://habr.com/ru/post/In132255/


All Articles