মোচা টেস্টিংয়ে এসিঙ্ক্রোনাস ফাংশন কল করার সময় কীভাবে সময়সীমা এড়ানো যায় ত্রুটি: 2000 মিমের সময়সীমা অতিক্রম করে


200

আমার নোড অ্যাপ্লিকেশনটিতে আমি আমার কোডটি পরীক্ষা করতে মোচা ব্যবহার করছি। মোচা ব্যবহার করে অনেকগুলি অ্যাসিঙ্ক্রোনাস ফাংশন কল করার সময়, আমি সময়সীমা ত্রুটি পেয়েছি ( Error: timeout of 2000ms exceeded.)। আমি কীভাবে এটি সমাধান করতে পারি?

var module = require('../lib/myModule');
var should = require('chai').should();

describe('Testing Module', function() {

    it('Save Data', function(done) {

        this.timeout(15000);

        var data = {
            a: 'aa',
            b: 'bb'
        };

        module.save(data, function(err, res) {
            should.not.exist(err);
            done();
        });

    });


    it('Get Data By Id', function(done) {

        var id = "28ca9";

        module.get(id, function(err, res) {

            console.log(res);
            should.not.exist(err);
            done();
        });

    });

});

এটি কি একীকরণের পরীক্ষা? এটি পরীক্ষা চালানোর জন্য অনেক সময় - সম্ভবত আপনার স্টাবগুলি বিবেচনা করা উচিত - github.com/thlorenz/proxyquire আপনাকে সাহায্য করতে পারে।
সুরুই

@surui ধন্যবাদ আমি চেহারা করবে
সচিন

আমি কি অ্যাসিঙ্ক্রোনাস স্টাফের জন্য প্রতিশ্রুতিগুলি ব্যবহার করার এবং এটির পরীক্ষা করার পরামর্শ দিচ্ছি চায়ের সাথে প্রতিশ্রুতি হিসাবে
ক্রিম

উত্তর:


344

আপনার পরীক্ষা চালানোর সময় আপনি সময়সীমা নির্ধারণ করতে পারেন:

mocha --timeout 15000

অথবা আপনি প্রতিটি স্যুট বা প্রতিটি পরীক্ষার জন্য প্রোগ্রামের সময়সীমা নির্ধারণ করতে পারেন:

describe('...', function(){
  this.timeout(15000);

  it('...', function(done){
    this.timeout(15000);
    setTimeout(done, 15000);
  });
});

আরও তথ্যের জন্য দস্তাবেজগুলি দেখুন


3
সংক্ষিপ্ত সংস্করণ হয় -t। আপনি যদি গ্রচ কাজটি থেকে মোচা চালানোর জন্য মোচা-পরীক্ষা ব্যবহার করেন, এটি বিকল্প বিকল্পগুলিতেও সমর্থিত options:{timeout:15000}
এসএমএস

5
এফওয়াইআই: মোচায় তীর ফাংশনগুলি নিরুত্সাহিত করা হয়েছে। mochajs.org/#arrow-funifications
c0ming

4
তীর ফাংশন উপরের লিঙ্কে নিরুৎসাহিত করা হয় না। এটি কেবলমাত্র জানায় যে প্রসঙ্গটি অ্যাক্সেস করার প্রয়োজন হলে আপনাকে কী করতে হবে তা আপনাকে কেবল জানতে হবে you টাইমআউটগুলির উপর নির্ভর করা ভঙ্গুর হিসাবে আমার কখনই প্রসঙ্গের প্রয়োজন হয় না, এবং আমার সমস্ত পরীক্ষাগুলি কয়েকটি এমএসে চালিত হয়, তবে সিনোন-টেস্ট ব্যবহার করার সময় আমি একই সমস্যাটি দেখতে পাই। এখনও 99% লম্বাডাস ব্যবহার করুন।
অলিগোফ্রেন

26
TypeError: this.timeout is not a functionব্যবহার করার সময়"mocha": "^3.5.0"
জুনিয়র মেহে

5
@adi আপনি কি নিশ্চিত যে আপনি তীর ফাংশন ব্যবহার করছেন না? এটি দস্তাবেজগুলিতে অ্যাসিঙ্ক / প্রতীক্ষার বিষয়ে তাই কাজ করা উচিত (এবং প্রতিশ্রুতি ব্যবহার করার মতো একই বিষয়)। যদিও অন্য প্রশ্নের মত মনে হচ্ছে।
Andreas Hultgren

80

আমি দেখতে পেয়েছি যে কেবলমাত্র সময়সীমা বাড়ানোর "সমাধান" এটি এখানে কী ঘটছে তা অস্পষ্ট করে

  1. আপনার কোড এবং / অথবা নেটওয়ার্ক কলগুলি খুব ধীর (ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য 100 এমএস হওয়া উচিত)
  2. দাবিগুলি (পরীক্ষাগুলি) ব্যর্থ হচ্ছে এবং মোচা তাদের উপর অভিনয় করতে সক্ষম হওয়ার আগে কিছু ত্রুটিগুলি গ্রাস করছে।

আপনি যখন মুচা কলব্যাক থেকে দৃser়তা ত্রুটিগুলি না পান তখন আপনি সাধারণত # 2 এর মুখোমুখি হন। এটি ব্যতিক্রমটিকে আরও গিলে ফেলে অন্য কিছু কোডের কারণে ঘটেছিল। এর সাথে ডিল করার সঠিক উপায়টি কোডটি ঠিক করা এবং ত্রুটিটি গ্রাস না করা

যখন বাহ্যিক কোডগুলি আপনার ত্রুটিগুলি গ্রাস করে

যদি এটি কোনও লাইব্রেরির ফাংশন হয় যা আপনি সংশোধন করতে অক্ষম হন তবে আপনাকে দৃ error়তা ত্রুটিটি ধরা এবং এটি নিজেকে মোচায় দেওয়ার দরকার। আপনি নিজের দৃ call়তা কলব্যাককে চেষ্টা / ধরা ব্লকে মোড়ক করে এবং সম্পন্ন হ্যান্ডলারের কোনও ব্যতিক্রম পাস করার মাধ্যমে এটি করেন।

it('should not fail', function (done) { // Pass reference here!

  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});

এই বয়লারপ্লেটটি অবশ্যই পরীক্ষাটিকে কিছুটা আনন্দদায়ক করার জন্য কিছু ইউটিলিটি ফাংশনে সরানো যেতে পারে:

it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});

// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try { 
        fn();
        done();
    } catch (error) {
        done(error);
    }
}

নেটওয়ার্ক পরীক্ষার গতি বাড়িয়ে দেওয়া

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

describe('api tests normally involving network calls', function() {

    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];

        this.xhr.onCreate = function (xhr) {
            requests.push(xhr);
        };
    },

    afterEach: function () {
        this.xhr.restore();
    }


    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);

        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });

});

দেখুন Sinon এর niseডক্স আরও তথ্যের জন্য।


আমার পরীক্ষার একটি বিশাল স্যুট রয়েছে এবং আমি প্রতিশ্রুতিটি done()শেষে সমস্ত কল করছি এবং তা নিশ্চিত করার জন্য আমি আমার চশমাগুলিতে সমস্ত প্রতিশ্রুতি দিয়েছি এবং আমি ইতিমধ্যে অ্যাঙ্গুলার ব্যবহার করে নেটওয়ার্ক কলগুলি উপহাস করছি $httpBackend, তবে কোনও ভাগ্য নেই। ট্র্যাচ-ক্যাচের সাথে প্রতিটি একক নকশাকে মোড়ানো খুব বাস্তববাদী বলে মনে হয় না। অন্য কোন পরামর্শ? ধন্যবাদ!
গুস্তাভো মাতিয়াস

@ গুস্তাভোম্যাটিয়াস আপনি প্রকৃতপক্ষে আপনার সমস্যাটি কী তা উল্লেখ করেননি, কেবল বলেছেন যে আপনার যে সমস্যা হচ্ছে তার সমাধান এটি নয়। দয়া করে বিস্তারিত করুন :-) আপনার পরীক্ষাগুলি কি পর্যাপ্ত পরিমাণে ব্যর্থ হচ্ছে না? এগুলি কি কখনও ব্যর্থ হয় তবে আপনি কেন জানতে চান? আপনি কী অর্জন করতে চান তা অনুমান করা শক্ত।
অলিগোফ্রেন

হাই @ ওলিগোফ্রেন! এটি আসলে সবচেয়ে ভাল ব্যাখ্যা ছিল না। এখানে আমার সমস্যার আরও বিশদ বিবরণ রয়েছে stackoverflow.com/questions/34510048/… ধন্যবাদ!
গুস্তাভো মাতিয়াস

"সাধারণভাবে, এই সমস্যাটি মোকাবেলার সবচেয়ে সহজ উপায় (তবে কুৎসিত) আপনার কোডকে চেষ্টা / ধরার সাথে আবদ্ধ করা এবং সম্পন্ন হ্যান্ডলারের কোনও ব্যতিক্রম পাস করা"। না, এটি মোটেও পরিষ্কার উপায় নয়। একটি দীর্ঘ শট দ্বারা না। সবচেয়ে পরিষ্কার উপায় হল কোড লেখা যা ব্যতিক্রমগুলি গ্রাস করে না। প্রতিবারই আমি কাউকে অভিযোগ করতে দেখেছি যে মোচা একটি ব্যর্থ পরীক্ষা শনাক্ত করছে না, কারণ ব্যতিক্রমটি গ্রাস করে এমন কিছু ছিল। একটি যোগ করার পদ্ধতি try.... catch...কাজ প্রায় বদলে পরীক্ষা অধীনে কোডে বাগ ফিক্স করুন।
লুই

@ লুইস সম্ভবত আপনি এখানে হুইস সম্পর্কে সঠিক হতে পারেন, কিন্তু আমি নীল বাদে এটি যাচাই করতে অক্ষম। যাহাই হউক না কেন, মানুষ একজাতীয় উৎকৃষ্ট কফি একটি সমস্যা আছে আপাতদৃষ্টিতে কিছু ত্রুটি ধরা না পারা আর না, এবং এই এটা নিয়ন্ত্রণ করার একটি উপায়। আপনার প্রদত্ত পদ্ধতিটি ধরে নিয়েছে যে ত্রুটিটি গ্রাসকারী কোডটি কোনও লাইব্রেরি ফাংশন বা অনুরূপ নয়, সেক্ষেত্রে এটি এত সহজে সমাধান করা হবে না।
অলিগোফ্রেন

7

কিছুটা দেরি হলেও কেউ ভবিষ্যতে এটি ব্যবহার করতে পারে ... নীচে আপনার প্যাকেজ.জসনে স্ক্রিপ্টগুলি আপডেট করে আপনি আপনার পরীক্ষার সময়সীমা বাড়াতে পারেন:

"scripts": { "test": "test --timeout 10000" //Adjust to a value you need }

কমান্ডটি ব্যবহার করে আপনার পরীক্ষা চালান test


আমার জন্য কাজ! তোমাকে ধন্যবাদ!
রায়লাভলেস

5

আপনি যদি তীর ফাংশন ব্যবহার করছেন:

it('should do something', async () => {
  // do your testing
}).timeout(15000)

1

আমার জন্য সমস্যাটি ছিল আসলে বর্ণনা ফাংশন, যা যখন একটি তীর ফাংশন সরবরাহ করা হয় তখন মোচা সময়সীমাটি মিস করে এবং ধারাবাহিকভাবে আচরণ না করে। (ES6 ব্যবহার করে)

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

সুতরাং সঠিকভাবে কাজ না করার সময় এটি কেমন দেখাচ্ছে:

describe('test', () => { 
 assert(...)
})

এবং এটি বেনামে ফাংশন ব্যবহার করে কাজ করে

describe('test', function() { 
 assert(...)
})

আশা করি এটি কাউকে সাহায্য করবে, উপরের জন্য আমার কনফিগারেশন: (নোডজেস: 8.4.0, এনপিএম: 5.3.0, মোচা: 3.3.0)


0

আমার ইস্যুটি প্রতিক্রিয়া ফেরত পাঠাচ্ছে না, তাই এটি ঝুলছিল। আপনি যদি এক্সপ্রেস ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে রেজ.সেন্ড (ডেটা), রেজ.জসন (ডেটা) বা আপনি যে এপিআই পদ্ধতিটি ব্যবহার করতে চান তা আপনি পরীক্ষা করছেন সেই রুটের জন্য কার্যকর করা হয়েছে।


0

পরীক্ষার ক্ষেত্রে ব্যবহৃত প্রতিশ্রুতিগুলি সমাধান / প্রত্যাখ্যান করার বিষয়টি নিশ্চিত করুন, এটি গুপ্তচরবৃন্দ বা স্টাবরা নিশ্চিত করে যে তারা সমাধান / প্রত্যাখ্যান করেছে।

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