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




automated-tests jestjs puppeteer (8)

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

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

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

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

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

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. मुझे यह त्रुटि मिलती है या नहीं, यह बहुत ही यादृच्छिक रूप से प्रतीत होता है

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


मैं जोड़ना चाहूंगा (यह एक टिप्पणी के लिए थोड़ा लंबा है) कि 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
  });
});

यह किया गया कार्य कॉल करना चाहिए जब यह परीक्षण से 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);
});

यहां मेरा समाधान: लेकिन मुझे नहीं पता कि यह आपकी कोड स्थिति से मेल खाता है या नहीं, लेकिन आप इसे आज़मा सकते हैं।

it('GET should return a status of 200 OK', async (done) => {
  await frisby
    .get('api-url')
    .expect('status', 200)
    .done(done)
});

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

  1. आप इसमें किसी तीसरे पैरामीटर को जोड़कर किसी भी व्यक्तिगत परीक्षा के समय से आगे निकल सकते हैं। अर्थात। 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 / प्रतीक्षा के दृष्टिकोण के साथ आवश्यक नहीं है।

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

शायद इससे किसी को ¯\_(:/)_/¯ मदद मिलेगी


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

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

jest.setTimeout(30000);

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

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

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

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

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

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

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


जब आप सख्त एक्सएचटीएमएल अनुपालन के लिए जा रहे हैं, तो आपको सीडीएटीए की तुलना में बहुत कम और अम्परेंड को अमान्य वर्णों के रूप में चिह्नित नहीं किया जाना चाहिए।





javascript automated-tests jestjs puppeteer