javascript एक असफल परीक्षण अन्य असिंक परीक्षणों को विफल करने का कारण बनता है




unit-testing asynchronous (2)

सबसे पहले मैंने सोचा कि यह एक बग था, लेकिन शानदार क्रोम डेवलपल्स के साथ कुछ शोध के बाद ऐसा लगता है कि यह कम से कम जैस्मीन के द्वारा अपेक्षित व्यवहार है हालांकि, कर्मा ढांचे में एक बग हो सकता है।

संक्षेप में, node_modules/karma/static/debug.js फ़ाइल (जो डीबग पेज के लिए जेएस-फाइल है) में ये रेखाएं हैं (मुझे Karma v1.7.0 ):

for (var i = 0; i < result.log.length; i++) {
  // Throwing error without losing stack trace
  (function (err) {
    setTimeout(function () {
      throw err
    })
  })(result.log[i])
}

यदि आप फेंक लाइन पर टिप्पणी करते हैं, और कर्मा सर्वर को पुनरारंभ करें, तो आपको केवल कंसोल लॉग संदेश दिखाई देंगे, जो उम्मीद की जानी चाहिए: पहले विफल, फिर पास करें, और फिर सारांश।

स्पष्ट रूप से, कर्मा में बग प्रत्येक व्यवहार के बाद रिपोर्ट करने के लिए उसके व्यवहार में हो सकता है।

यह वही हो रहा है जो कदम से कदम हो रहा है (मेरे पास संस्करण "jasmine-core": "^2.6.4" , कम से कम यह मेरे package.json में है। package.json फ़ाइल):

  1. जैस्मीन पहली युक्ति चलाता है और यह विफल रहता है;
  2. कर्मा लॉग में इस पर रिपोर्ट करता है और एक समारोह जोड़ता है, जो किसी त्रुटि को स्टैक में डाल देता है (मुझे लगता है कि पाठक को जावास्क्रिप्ट में अतुल्यकालिक मॉडल को जानता है, यदि नहीं, तो उसे इस बारे में "प्रभावी जावास्क्रिप्ट: 68 विशिष्ट तरीके" डेविड हर्मन , एक सच्ची रत्न पुस्तक, या अन्य जगहों से) "जावास्क्रिप्ट की शक्ति का उपयोग करना" इसके अलावा, यह महत्वपूर्ण है, यद्यपि मुझे यकीन नहीं है, क्योंकि मैंने इस कोड को गहन नहीं देखा है, इसलिए यह अगले चरण पर "वैश्विक त्रुटि" की तरह पंजीकृत है
  3. जैस्मीन दूसरी कल्पना चलाता है, और getJasmineRequireObj().GlobalErrors कॉल करता है getJasmineRequireObj().GlobalErrors फ़ंक्शन ( jasmine.js:2204 )। "वैश्विक त्रुटि" का पता लगाया जाता है और युक्ति तुरंत एक विफलता बन जाती है। कर्मा के कार्य के बाद स्टैक में एसिंक्रोनस की उम्मीद जोड़ दी जाती है, जो कि त्रुटि को फेंकता है
  4. फिर पहला कार्य (जो त्रुटि को फेंकता है) निष्पादन शुरू होता है, इसे फेंकता है। यह फ़ंक्शन हमेशा जैस्मीन असिंक्रोनस स्पेक से पहले कहलाता है, चूंकि debug.js में debug.js कॉल के लिए कोई समय बीत चुका नहीं है:

    //notice the absent time argument setTimeout(function () { throw err })

  5. जैस्मीन दूसरे मॉडल से एसिंन्क की उम्मीद करता है और यह गुजरता है

  6. कर्मा विफलता के रूप में दूसरी कल्पना पर रिपोर्ट करता है और त्रुटि को फेंकने में त्रुटि जोड़ता है (यदि टिप्पणी नहीं की गई है, तो कोई त्रुटि नहीं हुई है और यह विवरण गुजरता है) स्टैक पर
  7. कर्म की दूसरी त्रुटि फेंक जाती है

नीचे दी गई संख्याओं के साथ स्क्रीन शॉट्स हैं, सूची में दिए चरणों को स्पष्ट करने के लिए मेरे द्वारा दिए गए हैं:

debug.js फ़ाइल में टिप्पणी न करें:

और टिप्पणी के साथ throw :

मेरे पास एक टेस्ट सुइट जिसमें दो परीक्षण हैं, के साथ एक बहुत बुनियादी कर्म / चमेली सेटअप है I मुझे उम्मीद है कि पहला परीक्षण विफल हो जाएगा और दूसरी परीक्षा पास होगी।

describe("The system", function() {

    it("should fail", function() {
        expect(true).toBe(false);
    });

    it("should succeed", function(done) {
        setTimeout(function() {
            expect(1).toBe(1);
            done();
        }, 10);
    });
});

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

दूसरे परीक्षण के लिए त्रुटि संदेश है:

Uncaught Expected true to be false.
    at UserContext.<anonymous> (http://localhost:9876/base/workingspec.js:4:22) thrown

जब मैं पहली परीक्षा को अक्षम या निकालता हूं, तो दूसरी परीक्षा पास हो जाती है।

इस मामले में दोनों परीक्षण विफल क्यों होते हैं? पहली परीक्षा के त्रुटि संदेश के साथ दूसरी परीक्षा क्यों विफल होती है?

मेरे परीक्षण सेटअप में निम्न संकुल / संस्करण हैं:

+-- jasmine-[email protected].7.0
+-- [email protected].7.0
+-- karma-chrome-[email protected].2.0
+-- karma-[email protected].1.0
`-- [email protected]

समस्या वास्तव में कर्म Debug धावक की Debug.js फ़ाइल में है, के रूप में @ user907860 पहले से ही संकेत दिया यह जैस्मीन के लिए विशेष रूप से नहीं है मैंने इस मुद्दे की सूचना दी है और एक फिक्स बनाया है जिसे कर्मा की मास्टर शाखा में मिला दिया गया है, इसलिए अगली रिलीज इस मुद्दे को ठीक करना चाहिए।







karma-runner