चमेली: एस्मा कॉलबैक को चमेली द्वारा निर्दिष्ट टाइमआउट के भीतर निर्दिष्ट नहीं किया गया था। DFAULT_TIMEOUT_INTERVAL


141

मुझे एक कोणीय सेवा कहा जाता है requestNotificationChannel:

app.factory("requestNotificationChannel", function($rootScope) {

    var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";

    function deleteMessage(id, index) {
        $rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
    };

    return {
       deleteMessage: deleteMessage
    };

});

मैं चमेली का उपयोग करते हुए इस सेवा का परीक्षण करने की कोशिश कर रहा हूं:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope, scope;

    beforeEach(function(_requestNotificationChannel_) {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            scope = rootScope.$new();
            requestNotificationChannel = _requestNotificationChannel_;
        })

        spyOn(rootScope, '$broadcast');
    });


    it("should broadcast delete message notification", function(done) {

        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
        done();       
    });
});

मैंने जैस्मीन में एसिंक्रोनस सपोर्ट के बारे में पढ़ा, लेकिन जब तक मैं जावास्क्रिप्ट के साथ यूनिट टेस्टिंग के लिए नया हूं, यह काम नहीं कर सका।

मुझे एक त्रुटि प्राप्त हो रही है:

Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

और मेरा परीक्षण निष्पादित करने में बहुत लंबा समय ले रहा है (लगभग 5 s)।

क्या कोई मुझे कुछ स्पष्टीकरण के साथ अपने कोड का काम करने का उदाहरण प्रदान करने में मदद कर सकता है?


1
प्रसंस्करण की घटनाओं को आमतौर पर एक पाचन चक्र में किया जाता है। गुंजाइश जोड़ने का प्रयास करें $ () अपने परीक्षण के बजाय चमेली के async परीक्षण पद्धति का उपयोग कर लागू होते हैं।
Eitan सहकर्मी

यह काम नहीं करता है। मैंने गुंजाइश जोड़ दी। $ लागू (); बस कॉल करने के बाद अनुरोध करेंनोटिफिकेशनशनैल.डेलीमैसेज (1, 4), लेकिन मुझे वही त्रुटि मिलती है ...
एमडीबी

जब मैं एक ही त्रुटि मिलती है async परीक्षण में लंबा समय लग से चलाने के लिए Jestउम्मीद है बहुत आम है, जबकि डिबगिंग और कुछ समय चर का निरीक्षण करने के लेने -।
दान डस्केल्सस्कु

इसके बजाय कम टाइमआउट का उपयोग करने का प्रयास करें। टाइमआउट = 5000 का उपयोग करते समय मुझे यह त्रुटि मिली। मैंने इसे 2000 से बदल दिया और यह मेरे लिए काम कर गया!
मरीना रियाज

1
मेरे जूते में किसी की मदद करने के लिए इसे छोड़कर। डॉकटर कंटेनर के अंदर परीक्षण चलाते समय मुझे यह त्रुटि हुई थी। टेस्ट कभी-कभी बिना मुद्दों के पास हो जाते हैं, लेकिन कभी-कभी असफल हो जाते हैं। मुझे लगा कि यह किसी प्रकार की दौड़ की स्थिति है, लेकिन यह पता नहीं लगा सका कि क्यों। मुझे एहसास हुआ कि मेरे पास एक afterEachकदम था जो डेटाबेस को साफ कर रहा था ( deleteManyविधि का उपयोग करके )। jest.setTimeout(30000);इस beforeAllविधि में जोड़ने से मेरे लिए यह तय हो गया है - मैं अनुमान लगा रहा हूं क्योंकि डेटाबेस हटाना एक नेटवर्क कॉल है (शर्त के अंदर), यह कभी-कभी 3 सेकंड से अधिक समय ले रहा था और फेंक रहा था।
नखिल

जवाबों:


231

आपके itफ़ंक्शन में ( doneनीचे दिए गए कोड में) तर्क रखने से जैस्मिन को एसिंक्स कॉल का प्रयास करना पड़ेगा।

//this block signature will trigger async behavior.
it("should work", function(done){
  //...
});

//this block signature will run synchronously
it("should work", function(){
  //...
});

इससे कोई फर्क नहीं पड़ता कि क्या है done तर्क का नाम है, इसका अस्तित्व सभी मायने रखता है। मैं बहुत अधिक कॉपी / पास्ता से इस मुद्दे में भाग गया।

जैस्मीन अतुल्यकालिक समर्थन डॉक्स ध्यान दें कि तर्क ( doneऊपर नाम ) एक कॉलबैक है जिसे जैस्मीन को यह बताने के लिए बुलाया जा सकता है कि एक अतुल्यकालिक फ़ंक्शन पूरा होने पर। यदि आप इसे कभी नहीं कहते हैं, तो जैस्मीन को कभी नहीं पता चलेगा कि आपका परीक्षण किया गया है और अंततः समय समाप्त हो जाएगा।


3
वर्णन में
आर्गन्स के

@MartinBliss यह प्रलेखित है, मैंने प्रलेखन का उल्लेख करने के लिए एक संपादन का सुझाव दिया है: stackoverflow.com/suggested-edits/2434606
विन्सेंट

39
भविष्य में इस सवाल पर आने वाले यादृच्छिक Googlers पर ध्यान दें: यदि आप प्रोट्रैक्टर का उपयोग कर रहे हैं और इस समस्या में भाग लेते हैं, तो यह उत्तर वह नहीं है जो आप खोज रहे हैं - प्रोटेक्टर कॉलबैक को स्वयं कॉल करता है।
विंसेंट

इसने मेरी समस्या को ठीक कर दिया और यह उसी कपल "कॉपी / पास्ता" के कारण हुआ
शेख

1
@Vincent क्या प्रोट्रैक्टर उपयोगकर्ता जारी करते हैं, अगर यह त्रुटि होती है?
ब्रूनो बीरी

57

यहां तक ​​कि async परीक्षणों के लिए, इस मामले में एक समय समाप्त हो जाता है, आप एक async जैस्मीन कॉलबैक का मूल्यांकन करने के लिए सीमा मध्यांतर का मान बढ़ाकर इस त्रुटि के आसपास काम कर सकते हैं

describe('Helper', function () {
    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000;
    });

    afterEach(function() {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });

    it('Template advance', function(doneFn) {
        $.ajax({
            url: 'public/your-end-point.mock.json',
            dataType: 'json',
            success: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            },
            error: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            }
        });
    });
});

स्रोत: http://jasmine.github.io/2.0/introduction.html#section-42


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

मूल चमेली.DEFAULT_TIMEOUT_INTERVAL 60000 एमएस है। तो यह उदाहरण वास्तव में इसे छह गुना कम कर देगा।
वाल्टरी

आप सही हैं मैं सिर्फ इस उदाहरण में एक यादृच्छिक संख्या डाल देता हूं, धन्यवाद :)
gsalgadotoledo

20

यह त्रुटि किसी सर्विस / फैक्ट्री या जो कुछ भी शुरू करते समय इंजेक्शन छोड़ने से भी हो सकती है। उदाहरण के लिए, इसे ऐसा करके फेंक दिया जा सकता है:

var service;
beforeEach(function(_TestService_) {
    service = _TestService_;
});

इसे ठीक करने के लिए सेवा को ठीक से प्राप्त करने के लिए इंजेक्शन के साथ फ़ंक्शन लपेटें:

var service;
beforeEach(inject(function(_TestService_) {
    service = _TestService_;
}));

13
import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing';

fakeAsync का उपयोग करें

beforeEach(fakeAsync (() => {

//your code

}));



describe('Intilalize', () => {
        it('should have a defined component', fakeAsync(() => {
            createComponent();
            expect(_AddComponent.ngOnInit).toBeDefined();
        }));
    });

6

आप विश्व स्तर पर डिफ़ॉल्ट समय अंतराल को सेट करने के लिए कर्म-चमेली प्लगइन का उपयोग कर सकते हैं ।

इस config को karma.conf.js में जोड़ें

module.exports = function(config) {
  config.set({
    client: {
      jasmine: {
        timeoutInterval: 10000
      }
    }
  })
}

5

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

मुझसे मत पूछो, मुझे नहीं पता। लेकिन मेरी परिस्थिति में यह गलती पर सिस्टम संसाधनों की कमी लग रहा था।


5
संभवतः, जब आपका सीपीयू मुक्त था, तो कार्य डिफ़ॉल्ट समय से पहले समाप्त हो गया। जब CPU व्यस्त था, तो आपके द्वारा परीक्षण किया गया कार्य पूरा होने में बहुत लंबा समय लगा।
शेन

5

यह एक उत्तर की तुलना में अधिक अवलोकन है, लेकिन यह उन लोगों की मदद कर सकता है जो मेरे जैसे ही निराश थे।

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

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

पता नहीं इसका क्या कारण है, या इसे कैसे ठीक किया जाए, लेकिन कार्यशील निर्देशिका को हटाने और इसे वापस जाँचने के लिए जो कुछ भी था उसे ठीक किया गया।

आशा है कि यह किसी की मदद करता है।


1
शुक्रिया यार, मैं इस बारे में पागल हो रहा था। मैंने अपने पीसी को रिबूट किया और वह यह था
yngrdyn

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

4

उपयोग न करें done, बस फ़ंक्शन कॉल खाली छोड़ दें।


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

3

beforeAllफ़ंक्शन में कुछ उम्मीद करते समय आपको यह त्रुटि भी मिलती है!

describe('...', function () {

    beforeAll(function () {
        ...

        expect(element(by.css('[id="title"]')).isDisplayed()).toBe(true);
    });

    it('should successfully ...', function () {

    }
}

2

मेरे मामले में, यह त्रुटि "fixture.detectChanges ()" के अनुचित उपयोग के कारण हुई थी, ऐसा लगता है कि यह विधि एक ईवेंट श्रोता (async) है जो केवल कॉलबैक का जवाब देगी जब परिवर्तन का पता चलता है। यदि कोई परिवर्तन नहीं पाया जाता है तो यह कॉलबैक को लागू नहीं करेगा, जिसके परिणामस्वरूप टाइमआउट त्रुटि होगी। उम्मीद है की यह मदद करेगा :)


2

scopeसंदर्भ और फ़ंक्शन तर्कों को हटाने के बाद काम करता है:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope;

    beforeEach(function() {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            requestNotificationChannel = _requestNotificationChannel_;
        })
        spyOn(rootScope, "$broadcast");
    });


    it("should broadcast delete message notification with provided params", function() {
        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} );
    });
});

0

जैसा कि @mastablasta द्वारा उल्लेख किया गया है, लेकिन यह भी जोड़ना है कि यदि आप 'किया' तर्क को कहते हैं या इसे पूरा करते हैं, तो आपने अपने परीक्षण में कॉलबैक पूर्ण () के पूर्ण होने पर कॉल करें।

// this block signature will trigger async behavior.
it("should work", function(done){
  // do stuff and then call done...
  done();
});

// this block signature will run synchronously
it("should work", function(){
  //...
});

0

jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;

इसे ब्लॉक में रखने से मेरी समस्या हल हो गई।

it('', () => {
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
});

0

मैंने क्या किया: निम्नलिखित कोड जोड़ा गया / अपडेट किया गया:

framework: 'jasmine',
jasmineNodeOpts: 
{
    // Jasmine default timeout
    defaultTimeoutInterval: 60000,
    expectationResultHandler(passed, assertion) 
    {
      // do something
    },
}

3
कृपया समझाएं कि यह कोड बिना स्पष्टीकरण के केवल पोस्ट करने के बजाय क्यों काम करता है।
कोबे

इसलिए मूल रूप से जब आप किसी परीक्षा को अंजाम देते हैं और इसमें अपेक्षा से अधिक समय लगता है, तो यह विफल हो जाता है क्योंकि डिफ़ॉल्ट समय समाप्त हो गया था और स्क्रिप्ट निष्पादन में आगे नहीं बढ़ी। कुछ शर्तों के पूरा नहीं होने के कारण ऐसा हो सकता है (उदाहरण के लिए दृश्यता, पृष्ठ लोडिंग)। अब अगर आपका डिफॉल्ट टाइम 1000ms की तरह है। स्क्रिप्ट अक्सर विफल हो जाती है क्योंकि यह सिर्फ एक सेकंड है और आपकी स्क्रिप्ट की विफलता के साथ कई कारक हो सकते हैं। हालाँकि, अपने टाइमआउट अंतराल को बढ़ाने से ब्राउज़र / ड्राइवर को मिलने वाली स्थितियों के लिए अधिक समय तक इंतजार करना पड़ सकता है।
जीशान

2
ठीक है, अब इस शब्द को अपनी पोस्ट में; आपको स्पष्टीकरण के बिना कोड के साथ उत्तर देने से बचने की कोशिश करनी चाहिए :)
कोबे


0

ऐसा लगता है कि परीक्षण कुछ कॉलबैक की प्रतीक्षा कर रहा है जो कभी नहीं आता है। इसकी संभावना है क्योंकि परीक्षण एसिंक्रोनस व्यवहार के साथ निष्पादित नहीं किया गया है।

पहले, यह देखें कि क्या आपके "यह" परिदृश्य में सिर्फ fakeAsync का उपयोग कर रहा है:

it('should do something', fakeAsync(() => {

आप flush()माइक्रो टस्क कतार को समाप्त करने के लिए या tick()समय की एक निर्दिष्ट राशि की प्रतीक्षा करने के लिए भी उपयोग कर सकते हैं ।


-2

यदि आपके पास फ़ंक्शन doneमें कोई तर्क ( ) है तो itइसे निकालने का प्रयास करें और साथ ही इसे फ़ंक्शन के भीतर कॉल करें:

it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) {

    requestNotificationChannel.deleteMessage(1, 4);
    expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
    // done(); -> YOU SHOULD REMOVE IT        
});

4
किसी भी स्पष्टीकरण के बिना यह उत्तर क्यों उपयोगी नहीं है।
गैरी

2
इस जवाब ने मेरी समस्या हल कर दी ... कोणीय परीक्षण एक बुरा सपना है!
बेंजामिन कैर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.