2013-01-10 14 views
7

मैं बैकबोन और बैकबोन का उपयोग कर एक एकल पृष्ठ जावास्क्रिप्ट एप्लिकेशन लिख रहा हूं। मैरियनेट। मैं अपने कोड को व्यवस्थित करने और निर्भरताओं का प्रबंधन करने में सहायता के लिए एएमडी मॉड्यूल और RequJS का उपयोग कर रहा हूं। मैं टीडीडी/बीडीडी के लिए अपने परीक्षण ढांचे के रूप में Mocha का भी उपयोग कर रहा हूं।RequJS और Mocha के साथ Squire.js का उपयोग करते समय मैं वैश्विक लीक पेश करने से कैसे बचूं?

सब कुछ ठीक काम कर रहा था जब तक कि मैं Sinon.JS का उपयोग करके स्टब्स, मोजे और जासूसों को पेश नहीं करना चाहता था। बहुत सारी खोज के बाद, मैं test frameworks in the RequireJS wiki और Squire.js पर एक पृष्ठ पर आया, ऐसा लगता है कि यह मेरी आवश्यकताओं के अनुरूप होगा। हालांकि, जब मैं मॉड्यूल लोड करने के लिए Squire.js का उपयोग करने का प्रयास करता हूं, तो मोचा अचानक मॉड्यूल की निर्भरताओं के लिए वैश्विक रिसाव की रिपोर्ट करता है। यदि मैं Requ.JS का उपयोग कर सीधे मॉड्यूल लोड करता हूं तो कोई लीक रिपोर्ट नहीं की जाती है।

उदाहरण के लिए, निम्न परीक्षण कोड किसी भी लीक रिपोर्ट करने के लिए मोचा का कारण नहीं है:

define(['app/app'], function(app) { 
    describe('App', function() { 
     it('Should define a \'header\' region', function() { 
      expect(app.headerRegion).to.exist; 
     }); 

     it('Should define a \'main\' region', function() { 
      expect(app.mainRegion).to.exist; 
     }); 
    }); 

    return { 
     name: "App" 
    }; 
}); 

हालांकि, इस प्रकार Squire.js उपयोग करने के लिए कोड में परिवर्तित करने jQuery, रीढ़ के लिए लीक रिपोर्ट करने के लिए मोचा का कारण बनता है, और Marionette (app.js की निर्भरता):

define(['Squire'], function(Squire) { 
    describe('App', function() { 

     var testContext = {}; 

     beforeEach(function(done) { 
      testContext.injector = new Squire(); 
      testContext.injector.require(['app/app'], function(app) { 
       testContext.app = app; 
       done(); 
      }); 
     }); 

     it('Should define a \'header\' region', function() { 
      expect(testContext.app.headerRegion).to.exist; 
     }); 

     it('Should define a \'main\' region', function() { 
      expect(testContext.app.mainRegion).to.exist; 
     }); 
    }); 

    return { 
     name: "App" 
    }; 
}); 

मैं क्या गलत कर रहा हूं? मैं पूरी तरह से परेशान हूं कि मोचा RequJS के साथ रिसाव की रिपोर्ट नहीं करता है लेकिन Squire.js के साथ करता है। मैंने स्क्वायर.जेएस से पहले, अन्य StackOverflow question on mocking RequireJS dependencies जैसे कस्टम फ़ंक्शन और testr.js में पाए गए कुछ अन्य समाधानों की भी कोशिश की और इसी तरह के परिणाम थे। आज तक, मैं एक उदाहरण खोजने में असमर्थ हूं जो मोचा, RequJS, और Sinon.JS का एक साथ उपयोग करता है।

मेरे पास placed my current code base on GitHub है यदि कुछ महत्वपूर्ण जानकारी है जो मैंने छोड़ी है या कुछ है। प्रश्न में परीक्षण test\spec\test.app.js में पाया जा सकता है।

किसी भी सहायता की बहुत सराहना की जाती है। मैं अपने परीक्षण सेटअप के साथ और वास्तव में मेरे ऐप पर काम करने के लिए पिछले बंदरगाह प्राप्त करना चाहता हूं। अग्रिम में धन्यवाद।

उत्तर

5

आगे सोचने के बाद, मुझे एहसास हुआ कि यह वास्तव में व्यवहार की उम्मीद है और app.js के समय के दुष्प्रभाव को परीक्षण के लिए लोड किया गया है।

मेरे परीक्षण एक require बयान नीचे

require([ 
    'spec/test.smoketest', 
    'spec/test.app' 
    ], runMocha); 

दिखाए जाने वाले इन RequireJS के माध्यम से लोड किए गए हैं जहां runMocha बस एक समारोह है कि बस mocha.run() कॉल है।

यह मेरे लिए हुआ कि जिस तरह मोचा सबसे अधिक वैश्विक लीक का पता लगाता है, वह तुलना है कि प्रत्येक परीक्षण के पहले और बाद में वैश्विक स्तर पर पंजीकृत होने की तुलना करें। उपरोक्त पहले उदाहरण में, जहां लीक की रिपोर्ट नहीं की जाती है, jQuery, बैकबोन और मैरियनेट को RequJS द्वारा लोड किया जाता है, इससे पहले mocha.run() को test.app.js मॉड्यूल लोड करने का हिस्सा कहा जाता है। दूसरी ओर, jQuery, बैकबोन, और मैरियनेट को दूसरे उदाहरण में स्वयं परीक्षणों के हिस्से के रूप में लोड किया जाता है।

इस प्रकार, पहले विन्यास किसी भी लीक रिपोर्ट नहीं करता क्योंकि jQuery, रीढ़, और कठपुतली पहले से ही से पहलेmocha.run() कहा जाता है विश्व स्तर पर पंजीकृत हैं। दूसरी कॉन्फ़िगरेशन लीक की रिपोर्ट करता है क्योंकि वे परीक्षण के दौरान पंजीकृत हैं।

अब जब मैं समझता हूं कि क्या हो रहा है और यह उम्मीद की जाती है, तो मैं इन वैश्विक वस्तुओं को अनुमति देने के लिए मोचा को कॉन्फ़िगर करने में सहज महसूस कर रहा हूं।यह मोचा कॉन्फ़िगरेशन में किया जा सकता है जैसा कि नीचे दिखाया गया है:

mocha.setup({ 
    ui: "bdd", 
    globals:["_", "$", "jQuery", "Backbone", "Marionette"] 
}); 
संबंधित मुद्दे