জেস্ট.সেটটাইমআউট দ্বারা নির্ধারিত 5000 মিমির সময়সীমার মধ্যে অ্যাসিঙ্ক কলব্যাক চালু করা হয়নি


237

আমি সামনের কিছু শেষ পরীক্ষা চালানোর জন্য পুতুল এবং রসিকতা ব্যবহার করছি।

আমার পরীক্ষাগুলি নিম্নরূপ দেখায়:

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. আমি এই ত্রুটিটি পাই কিনা তা আপাতদৃষ্টিতে খুব এলোমেলো

কেউ অনুমান করতে পারে কেন এমন হচ্ছে?


কোন লাইনের সময়সীমা শেষ?
লয়েড

@ আসোল আপনি কি গিটহাব রেপো সরবরাহ করতে পারবেন? আপনাকে সমাধান সরবরাহ করা আমাদের পক্ষে সহজ এবং দ্রুততর হবে। :)
শিশির আঁশুমান

@ আসুল, আমি পোস্ট করা উত্তরের বিষয়ে কোনও প্রতিক্রিয়া
তরুণ লালওয়ানি

1
এটি কি এমন হতে পারে যে পরীক্ষাটি 30000 মিমি জন্য ব্যর্থ হয় তবে রসিকতা থেকে ত্রুটিটি কেবল আপনি যে মূল্য দিয়েছিলেন তা অন্তর্ভুক্ত নয়? অর্থ, আপনি যদি 0 মিমি সময় রেখে দেন, তামাশার ত্রুটি কি পরিবর্তন হয়?
নিরিত লেভি

আমি যখন আমার পরীক্ষাগুলি ডিবাগ করছিলাম তখন আমি এই ত্রুটিটি দেখেছি saw একটি ব্রেকপয়েন্ট এ বাঁধন এই ত্রুটি পেতে সৃষ্ট
Neets

উত্তর:


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

পিএস ভুল বানান setupFilesAfterEnv(যেমন setupFileAfterEnv) এছাড়াও একই ত্রুটি নিক্ষেপ করবে।


2
এমন কোনও প্রশ্নের উত্তরের জন্য ধন্যবাদ যা আমি জেস্ট ডকুমেন্টেশনের মাধ্যমে সহজেই খুঁজে পাই না।
হার্টলেসান

21
যেহেতু এটি আমাকে সহায়তা করেছিল, এটি লক্ষণীয় যে এই setupTestFrameworkScriptFileপ্রতিস্থাপনটি প্রতিস্থাপন করা হয়েছে setupFilesAfterEnv, তাই এটি হয়ে যায়setupFilesAfterEnv: ["./jest.setup.js"]
ম্যাক্সিমাম জেরিঙ্ক

আমি এটিও পেয়েছি যা 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একটি অ্যাসিঙ্ক ফাংশন করা উচিত? আমরা কি কেবল প্রতিশ্রুতি বা অপরিবর্তিত ফিরিয়ে দিই না?
চার্লি শ্লিয়েসার

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

এটি তুলনামূলকভাবে নতুন আপডেট তবে এটি আরও সোজা এগিয়ে। আপনি যদি ঠাট্টা 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
ভাল উল্লেখ করা হয়েছে, @ জেনভেন্টজি। ধন্যবাদ :)!
ivanleoncz

11

জেস্ট 24.9+ এর জন্য, আপনি যোগ করে কমান্ড লাইন থেকে সময়সীমা নির্ধারণ করতে পারেন --testTimeout

এটির ডক্স থেকে একটি অংশ এখানে

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

3

আমি সম্প্রতি অন্য কোনও কারণে এই সমস্যাটিতে ছড়িয়ে পড়েছি: আমি সিঙ্ক্রোনিকভাবে কিছু পরীক্ষা চালিয়ে যাচ্ছিলাম jest -iএবং এটির সময়সীমা শেষ হবে। যে কারণেই হোক না কেন, একই পরীক্ষা ব্যবহার করে চালানো jest --runInBand(যদিও -iওরফে হিসাবে বোঝানো হয়েছে) সময় শেষ হয় না।

সম্ভবত এটি কাউকে সাহায্য করবে ¯\_(:/)_/¯


1

টাইমআউট সমস্যা দেখা দেয় যখন কোনও নেটওয়ার্ক ধীর হয়ে যায় বা অনেকগুলি নেটওয়ার্ক কল ব্যবহার করা হয় await, এই পরিস্থিতিগুলি ডিফল্ট সময়সীমা অর্থাৎ 5000 মিমি ছাড়িয়ে যায়। সময়সীমা ত্রুটি এড়াতে কেবল সময়সীমা সমর্থন করে এমন গ্লোবালের সময়সীমা বাড়ানো। গ্লোবালগুলির তালিকা এবং তাদের স্বাক্ষর এখানে পাওয়া যাবে
জেস্ট 24.9 এর জন্য


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

যদি জেস্টে <= 23:

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

যদি জেস্টে> 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 এর সময়সীমা নির্ধারণের পরেও দূরে যাবে না Simp টার্মিনালে কেবল প্রক্রিয়াটি শেষ করে এবং পরীক্ষাগুলি পুনরায় চালানো আমার জন্য সমস্যাটি সমাধান করে। আমি সময়সীমাও সরিয়ে দিয়েছি এবং পরীক্ষাগুলি আবার পাস হচ্ছে।


-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);
        });
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.