Async कॉलबैक jest.setTimeout द्वारा निर्दिष्ट 5000ms के समय के भीतर लागू नहीं किया गया था


238

मैं कुछ फ्रंट एंड टेस्ट चलाने के लिए कठपुतली और कीट का उपयोग कर रहा हूं।

मेरे परीक्षण इस प्रकार हैं:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async () => {
      await page.waitForSelector(PROFILE.TAB);
      await page.click(PROFILE.TAB);
    }, 30000);
});

कभी-कभी, जब मैं परीक्षण चलाता हूं, तो सब कुछ अपेक्षित रूप से काम करता है। दूसरी बार, मुझे एक त्रुटि मिली:

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

      at node_modules/jest-jasmine2/build/queue_runner.js:68:21
      at Timeout.callback [as _onTimeout] (node_modules/jsdom/lib/jsdom/browser/Window.js:633:19)

यह अजीब है क्योंकि:

  1. मैंने टाइमआउट को 30000 बताया

  2. मुझे यह त्रुटि मिलती है या नहीं, यह बहुत ही अनियमित प्रतीत होता है

क्या कोई अनुमान लगा सकता है कि ऐसा क्यों हो रहा है?


किस लाइन से टाइमिंग निकल रही है?
लॉयड

@ असोल आप एक GitHub रेपो प्रदान कर सकता है? हमारे लिए आपको समाधान प्रदान करना आसान और तेज़ होगा। :)
शिशिर अंशुमान

@ एसओएल, मेरे द्वारा पोस्ट किए गए जवाब पर कोई प्रतिक्रिया
तरुण लालवानी

1
क्या यह हो सकता है कि परीक्षण वास्तव में 30000ms के लिए विफल हो, लेकिन जेस्ट से त्रुटि केवल आपके द्वारा पारित मूल्य को शामिल नहीं करती है? अर्थ, यदि आप 0ms का समय लगाते हैं, तो क्या jest error बदल जाता है?
नरीत लेवी

मैंने यह त्रुटि देखी जब मैं अपने परीक्षण डिबग कर रहा था। ब्रेकपॉइंट पर रुकने से यह त्रुटि हुई
नीट

जवाबों:


259

इसलिए आपके द्वारा यहां निर्दिष्ट समय-सीमा डिफ़ॉल्ट समय-सीमा से कम होनी चाहिए।

डिफ़ॉल्ट टाइमआउट है 5000और डिफ़ॉल्ट रूप से ढांचा इसके jasmineमामले में है jest। आप परीक्षण के अंदर टाइमआउट को जोड़कर निर्दिष्ट कर सकते हैं

jest.setTimeout(30000);

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

https://facebook.github.io/jest/docs/en/configuration.html#setuptestframeworkscriptfile-string

// jest.config.js
module.exports = {
  // setupTestFrameworkScriptFile has been deprecated in
  // favor of setupFilesAfterEnv in jest 24
  setupFilesAfterEnv: ['./jest.setup.js']
}

// jest.setup.js
jest.setTimeout(30000)

इस धागे को भी देखें

https://github.com/facebook/jest/issues/5055

https://github.com/facebook/jest/issues/652

PS गलत वर्तनी setupFilesAfterEnv(यानी setupFileAfterEnv) भी उसी त्रुटि को फेंक देगी।


2
एक सवाल का जवाब देने के लिए धन्यवाद जो मुझे जेस्ट प्रलेखन के माध्यम से आसानी से नहीं मिला।
हार्टलेसन

21
जैसा कि इसने मेरी मदद की, यह ध्यान देने योग्य हो सकता है कि इसे setupTestFrameworkScriptFileबदल दिया गया है setupFilesAfterEnv, इसलिए यह बन जाता हैsetupFilesAfterEnv: ["./jest.setup.js"]
मैक्सिम जेरिनक

1
मैंने यह भी पाया कि jest.setTimeout(10000)एक किनारे मामले के लिए एक ही परीक्षण में जोड़ा जा सकता है इसलिए पूरे विन्यास को बदलने की आवश्यकता नहीं है :)
जेम्स

मैं कुछ याद करना चाहिए, लेकिन अगर मैं जोड़ने jest.setTimeout(30000);में jest.config.jsमैं "ReferenceError: हंसी से परिभाषित नहीं है"। मैंने जोड़ने की कोशिश की, const jest = require("jest");लेकिन फिर मुझे "TypeError: jest.setTimeout एक फ़ंक्शन नहीं है"।
जीन पॉल

ओह, मैं बहुत तेजी से पढ़ता हूं: जहां हम विकल्प रखते हैं वहां setupFilesAfterEnvतर्क jest.config.jsदूसरी फाइल की ओर इशारा करता jest.setTimeout(30000)है। यह अच्छा है कि हम इसे कॉन्फ़िगर कर सकते हैं लेकिन यह मुझे थोड़ा जटिल लगता है।
जीन पॉल

64

async/awaitजब यह परीक्षण से async है तब इसे कॉल करना चाहिए ।

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, async (done) => {
        await page.waitForSelector(PROFILE.TAB);
        await page.click(PROFILE.TAB);
        done();
    }, 30000);
});

24
हमें doneएक async फ़ंक्शन में क्यों होना चाहिए ? क्या हम केवल वादा या अपरिभाषित नहीं लौटाते?
चार्ली श्लेसेर

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

2
धन्यवाद दोस्तों, मैंने doneकॉलबैक को हटा दिया है जिसकी आवश्यकता नहीं है।
स्कॉलर का कोड

26
क्या यह मूल प्रश्न के समान कोड नहीं है?
जो

1
doneकॉलबैक में एक पैरामीटर ( इस मामले में नामित ) की उपस्थिति जेस्ट का इंतजार करती है जब तक कि यह पैरामीटर कहा जाता है। इसका उपयोग न होने पर भी इसकी उपस्थिति महत्वपूर्ण है।
विघ्न

54

इस सवाल का जवाब बदल गया है क्योंकि जेस्ट विकसित हो गया है। वर्तमान उत्तर (मार्च 2019):

  1. आप तीसरे पैरामीटर को जोड़कर किसी भी व्यक्तिगत परीक्षा के समय समाप्त कर सकते हैं it। अर्थात।it('runs slow', () => {...}, 9999)

  2. आप डिफ़ॉल्ट का उपयोग कर बदल सकते हैं jest.setTimeout। यह करने के लिए:

 // config
   "setupFilesAfterEnv": [  // NOT setupFiles
     "./src/jest/defaultTimeout.js"
   ],

तथा

// File: src/jest/defaultTimeout.js
/* global jest */
jest.setTimeout(1000)
  1. जैसा कि दूसरों ने नोट किया है, और सीधे इस से संबंधित doneनहीं है, async / प्रतीक्षा दृष्टिकोण के साथ आवश्यक नहीं है।

5
यह अधिक आधुनिक संस्करण है
जोंसडाउन

23

मैं जोड़ना चाहूंगा (यह एक टिप्पणी के लिए थोड़ा लंबा है) जो कि 3000मेरे परीक्षणों के टाइमआउट के साथ अभी भी कभी-कभी (रैंडम) होगा

Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

@ तरुण के शानदार जवाब के लिए, मुझे लगता है कि बहुत सारे परीक्षण तय करने का सबसे छोटा तरीका है:

describe('puppeteer tests', () => {
  beforeEach(() => {
    jest.setTimeout(10000);
  });

  test('best jest test fest', async () => {
    // blah
  });
});

9
आपको कॉल करने की आवश्यकता नहीं jest.setTimeout()है beforeEach, इसे एक बार कॉल करना सभी परीक्षणों के लिए पर्याप्त है।
मार्कोस परेरा

19

यह एक अपेक्षाकृत नया अपडेट है लेकिन यह बहुत अधिक सीधे आगे है। यदि आप jest 24.9.0 या इससे अधिक का उपयोग कर रहे हैं, तो आप अपने कॉन्फिगर testTimeoutको जोड़ सकते हैं :

// in jest.config.js
module.exports = {
  testTimeout: 30000
}

17

done();कॉलबैक पर चालान करना सुनिश्चित करें या यह केवल परीक्षा पास नहीं करेगा।

beforeAll((done /* call it or remove it*/) => {
  done(); // calling it
});

अन्य सभी कार्यों पर लागू होता है जिनमें एक काम किया है () कॉलबैक।


1
अच्छी तरह से उल्लेख किया, @ZenVentzi। धन्यवाद :)!
ivanleoncz

11

Jest 24.9+ के लिए, आप कमांड लाइन से टाइमआउट भी जोड़ सकते हैं --testTimeout

यहाँ इसके डॉक्स का एक अंश है

--testTimeout=<number>
Default timeout of a test in milliseconds. Default value: 5000.

3

मैं हाल ही में इस मुद्दे पर एक अलग कारण से भाग गया: मैं कुछ परीक्षणों का उपयोग करके सिंक्रनाइज़ेशन चला रहा था jest -i, और यह सिर्फ टाइमआउट होगा। जो भी तर्क के लिए, एक ही परीक्षण का उपयोग करके jest --runInBand(भले ही -iउर्फ होने का मतलब है) चलाना समय नहीं खत्म करता है।

शायद यह किसी की मदद करेगा ¯\_(:/)_/¯


1

टाइमआउट समस्या तब होती है जब या तो नेटवर्क धीमा होता है या कई नेटवर्क कॉल का उपयोग किया जाता है await, ये परिदृश्य डिफ़ॉल्ट टाइमआउट यानी 5000ms से अधिक होते हैं। टाइमआउट त्रुटि से बचने के लिए बस एक टाइमआउट का समर्थन करने वाले ग्लोबल्स के टाइमआउट को बढ़ाएं। ग्लोबल्स की सूची और उनके हस्ताक्षर यहां देखे जा सकते हैं
जेस्ट के लिए 24.9


1
// in jest.setup.js
jest.setTimeout(30000)

यदि जेस्ट <= 23 पर:

// in jest.config.js
module.exports = {
  setupTestFrameworkScriptFile: './jest.setup.js'
}

अगर Jest> 23 पर:

// in jest.config.js
module.exports = {
  setupFilesAfterEnv: ['./jest.setup.js']
}


0

यदि कोई समस्या के उपयोग के तरीकों को ठीक नहीं करता है, तो मैंने एरो फंक्शन को तीर की क्रिया द्वारा घेर लिया। जैसे की:

describe("Profile Tab Exists and Clickable: /settings/user", () => {
    test(`Assert that you can click the profile tab`, (() => {
      async () => {
        await page.waitForSelector(PROFILE.TAB)
        await page.click(PROFILE.TAB)
      }
    })(), 30000);
});

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

0

मेरे मामले में, यह त्रुटि बेतरतीब ढंग से दिखाई देने लगी और 30000 की समयावधि निर्धारित करने के बाद भी दूर नहीं जाएगी। बस टर्मिनल में प्रक्रिया समाप्त करने और परीक्षण फिर से चलाने से मेरे लिए समस्या हल हो गई। मैंने टाइमआउट भी निकाल दिया है और परीक्षण अभी भी फिर से गुजर रहे हैं।


-2

नोड में ... मैंने देखा कि लोगों ने एक उदाहरण के रूप में क्या किया है, नीचे है fakeEventEmitter

import { EventEmitter } from 'events';
describe('your case', () => {
 let fakeEventEmitter: EventEmitter;
 beforeEach(async () => {
   fakeEventEmitter = new EventEmitter();
   (fakeEventEmitter as any).pid = 123;
 }),
 it('should do something you want to do', done => {
            anAsynchronouseFunction(testOptions, context).subscribe({
                complete: () => {
                    expect(something).toBeTruthy();
                    done();
                }
            });
            fakeEventEmitter.emit('exit', 0);
        });
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.