মোচায় একটি একক পরীক্ষার ক্ষেত্রে সময়সীমা কীভাবে বাড়ানো যায়


405

আমি একটি পরীক্ষার ক্ষেত্রে একটি নেটওয়ার্ক অনুরোধ জমা দিচ্ছি, তবে এটি কখনও কখনও 2 সেকেন্ডেরও বেশি সময় নেয় (ডিফল্ট সময়সীমা)।

আমি কীভাবে একক পরীক্ষার ক্ষেত্রে সময়সীমা বাড়াতে পারি?

উত্তর:


669

আপনি এখানে যান: http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

তীর ফাংশনের জন্য নীচে হিসাবে ব্যবহার করুন:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);

23
সময়সীমার মিলিসেকেন্ডে, এবং এটা ডিফল্ট 2000.
ইথান মিক

47
আমি es6 তীর ফাংশন ব্যবহার করছিলাম এবং "এটি" কাজ করার জন্য পুরানো 'ফাংশন' সংজ্ঞাগুলিতে ফিরে যেতে হয়েছিল।
অরুণা হেরথ

1
হুকের জন্যও কাজ করে, যেমনbefore(function(done){this.timeout(5 * 1000);...});
জেপি

2
@ এএআরএর ফাংশনটি কাজ না করার কারণটি লেক্সিকাল
ট্যানার ফকনার

11
এ্যার ফাংশন নিয়ে কাজ করার কোনও উপায় আছে কি? সম্পাদনা: অ্যাড .timeout(500)শেষেit(...).timeout(500)
chovy

136

আপনি যদি এস 6 তীরের ফাংশনগুলি ব্যবহার করতে চান তবে আপনি .timeout(ms)নিজের itসংজ্ঞাটির শেষে একটি যুক্ত করতে পারেন :

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

কমপক্ষে এটি টাইপস্ক্রিপ্টে কাজ করে।


3
এটি কাজ করে, তবে .timeoutমোচার জন্য নির্দিষ্ট টাইপযুক্ত টাইপগুলিতে অন্তর্ভুক্ত নয়: i.imgur.com/jQbWCn1.png - নিয়মিত পুরানো ফাংশন ব্যবহার করে this.timeout(2000)বা this.slow(500)সহ ত্রুটি ছাড়াই সংকলন করে
লিওন অ্যাডলার

3
দুঃখের বিষয়, এটি কেবল তার জন্য কাজ করে it, এটি কাজ করে না describe
রবিরিচ

3
এই জন্য কোন উপায় আছে describe()বা context()?
chovy

1
@LeonAdler .timeoutএখন DefinitelyTyped এর একজাতীয় উৎকৃষ্ট কফি typings মধ্যে অন্তর্ভুক্ত করা হয়: Mocha.IRunnable। তবে, আপনি যদি এই টেস্টগুলি চালনার জন্য ওয়েবস্টর্ম আইডিই ব্যবহার করেন, তবে সাবধানতার একটি নোট: যে কোনও কারণেই হোক না কেন, ওয়েবস্টোরমের মোচা ইন্টিগ্রেশন প্লাগইনটি এখনও মচা পরীক্ষাগুলি .timeout()সংযুক্ত করে সনাক্ত করতে পারে না (যার অর্থ 'পাশের কোনও' রান 'বোতামটি উপস্থিত নেই), এবং এইভাবে this.timeout()পরিবর্তে ব্যবহারের অনুমতি দেওয়ার জন্য আমি তীর ফাংশন এড়িয়ে চলার পক্ষে আছি ।
জেমি বার্চ

এটি নিখুঁত। অ্যাসিঙ্ক ফাংশনটির প্রতিশ্রুতি ফিরিয়ে দেওয়ার জন্য আপনি কাজটি ছেড়ে দিতে পারেন ()।
বিলওভারটন

72

(যেহেতু আমি আজ এটিতে ছুটেছি)

ES2015 ফ্যাট তীর সিনট্যাক্স ব্যবহার করার সময় সতর্কতা অবলম্বন করুন:

এটি ব্যর্থ হবে:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

সম্পাদনা: কেন এটি ব্যর্থ হয়:

@ মন্তব্যগুলিতে যেমন উল্লেখ করা হয়েছে, ফ্যাট অ্যার ফাংশনগুলির নিজস্ব এই বাঁধাই নেই। অতএব, এটা সম্ভব নয় এটা কাজ জুড়তে এই কলব্যাক ও একটি প্রদান সময়সীমার ফাংশন।

নীচের লাইন : বর্ধিত সময়সীমা প্রয়োজন এমন ক্রিয়াকলাপগুলির জন্য তীর ফাংশন ব্যবহার করবেন না।


2
কারণ তীর ফাংশনগুলিতে এটি মোটেই নেই। এখানে আরও পড়ুন: blog.getify.com/arrow-this
এথো

2
হ্যাঁ তবে আমি উত্তরে এটি ব্যাখ্যা করেছি। আমার মন্তব্য দেখুন। // কোডের ভিতরে। এটি পরিষ্কার করার জন্য আমার সম্ভবত কোড ব্লকের বাইরে এটি ব্যাখ্যা করা উচিত। এটি বিদ্যমান কিন্তু এটি বাহ্যিক ক্ষেত্র থেকে আসে।
খ্রিস্টলি

1
আমার ব্যাখ্যা আরও সঠিক। thisতীরের ক্রিয়াকলাপগুলির জন্য কোনও বাধ্যবাধকতা নেই - একইভাবে নয় যে তারা কোনও ধরণের, কেবল আলাদা suggest তাদের কেবল লেসিকাল স্কোপ রয়েছে। আপনি এটি অ-বিদ্যমানকে বাঁধতে পারবেন না। কেন যে .bind, .callইত্যাদি এটা দিয়ে কাজ করে না।
এথোথ

1
এটি সত্য - এবং আপনার অধিকার এটি আরও সঠিক। ধন্যবাদ
খ্রিস্টলি

1
আমি বলব যে এ কারণেই যখন আপনার প্রয়োজন তখন কেবল ফ্যাট তীরগুলি ব্যবহার করা উচিত তবে আমি যা thisজানি তার ট্র্যাক হারিয়েছি ।
xdumaine

42

আপনি যদি নোডজেএস ব্যবহার করে থাকেন তবে আপনি প্যাকেজ.জসনে টাইমআউট সেট করতে পারেন

"test": "mocha --timeout 10000"

তারপরে আপনি এনএমপি ব্যবহার করে চালাতে পারেন:

npm test

1
এটি সমস্ত পরীক্ষার ক্ষেত্রে, একক পরীক্ষার কেস নয়
গ্যারেপ করুন

সম্মত হয়েছেন যে এটি প্রশ্নের উত্তর দেয় না, তবে এটি আমার ব্যবহারের ক্ষেত্রে যথেষ্ট ছিল যেখানে আমি সমস্ত যত্নের জন্য এটি বাড়িয়ে দিলে যত্ন করি না। আমি মনে করি যে এখানে প্রচুর পরিমাণে লোক এসেছিল তারা যদি এটি এক পরীক্ষার জন্য বা সমস্তের জন্য বিবেচনা না করে তবে এই উত্তরটি এখানে উপস্থিত থাকায় আমি প্রশংসা করি।
বিলওভারটন

22

কমান্ড লাইন থেকে:

mocha -t 100000 test.js

14
এটি প্রশ্নটির মতো "নির্দিষ্ট টেস্টের ক্ষেত্রে" চেয়ে সমস্ত পরীক্ষার ক্ষেত্রে সময়সীমা বাড়িয়ে তোলে।
লুই

16

আপনি অন্য কোনও পদ্ধতির গ্রহণ এবং নেটওয়ার্ক রিসোর্সে কলটিকে স্টাব বা মক অবজেক্টের সাথে প্রতিস্থাপনের বিষয়েও ভাবতে পারেন। সিনন ব্যবহার করে , আপনি আপনার উন্নয়নের প্রচেষ্টাগুলিকে ফোকাস করে নেটওয়ার্ক পরিষেবা থেকে অ্যাপ্লিকেশনটি ডিকুয়াল করতে পারেন।


7
এটি সম্পূর্ণ অপ্রাসঙ্গিক নয়; ঘন ঘন, নেটওয়ার্ক প্রতিক্রিয়াটি স্ট্যাব করার জন্য এটি বোধগম্য হয় যাতে আপনি সেই মেশিনটি আপ হয়ে বা সঠিক প্রতিক্রিয়াটি ফিরে আসার উপর নির্ভর করেন না। তবে আপনি যদি প্রতিক্রিয়াটি নিজেই পরীক্ষা করছেন তবে হ্যাঁ, আপনার এখনও এটি করা দরকার।
এন্ড্রু

2
আমি কিছু ইন্টিগ্রেশন পরীক্ষার জন্য সিনন / মোচা ব্যবহার করছি, তাই উচ্চতর সময়সীমা প্রাসঙ্গিক।
jcollum

9

পরীক্ষার নাভগেশনের জন্য Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

উদাহরণস্বরূপ পরীক্ষার সময় 4000 (4 এস)।

দ্রষ্টব্য: পরীক্ষার সময় যা বলা হয় তার setTimeout(done, 3500)চেয়ে সামান্য doneতবে clearTimeout(timeOut)এটি এই সমস্ত সময় ব্যবহারের চেয়ে এড়ায়।


2

এটি আমার পক্ষে কাজ করেছিল! এটির সাথে কাজ করার জন্য কিছু আগে খুঁজে পাওয়া যায়নি ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});

.টাইমআউট () পুরোপুরি কাজ করেছে!
অ্যাসিডজাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.