জুঁই: জ্যাসমিন দ্বারা নির্দিষ্ট সময়সীমার মধ্যে অ্যাসিঙ্ক কলব্যাক চালু করা হয়নি DE


141

আমার কাছে একটি কৌণিক পরিষেবা রয়েছে requestNotificationChannel:

app.factory("requestNotificationChannel", function($rootScope) {

    var _DELETE_MESSAGE_ = "_DELETE_MESSAGE_";

    function deleteMessage(id, index) {
        $rootScope.$broadcast(_DELETE_MESSAGE_, { id: id, index: index });
    };

    return {
       deleteMessage: deleteMessage
    };

});

আমি জুঁই ব্যবহার করে এই পরিষেবাটি পরীক্ষা করার চেষ্টা করছি:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope, scope;

    beforeEach(function(_requestNotificationChannel_) {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            scope = rootScope.$new();
            requestNotificationChannel = _requestNotificationChannel_;
        })

        spyOn(rootScope, '$broadcast');
    });


    it("should broadcast delete message notification", function(done) {

        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
        done();       
    });
});

আমি জেসমিনে অ্যাসিক্রোনাস সমর্থন সম্পর্কে পড়েছি, তবে জাভাস্ক্রিপ্টের সাথে ইউনিট টেস্টিংয়ের পরিবর্তে আমি নতুন হয়েছি এটি কার্যকর করতে পারে নি।

আমি একটি ত্রুটি পেয়েছি:

Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL

এবং আমার পরীক্ষাটি কার্যকর করতে প্রায় দীর্ঘ সময় নিচ্ছে (প্রায় 5s)।

কেউ আমাকে কিছু ব্যাখ্যা দিয়ে আমার কোডের কাজের উদাহরণ প্রদান করতে সহায়তা করতে পারেন?


1
প্রক্রিয়াজাতকরণ ইভেন্টগুলি সাধারণত ডাইজেস্ট চক্রে করা হয়। সুযোগ যোগ করার চেষ্টা করুন Jas জেসমিনের অ্যাসিঙ্ক পরীক্ষার ধরণটি ব্যবহার না করে আপনার পরীক্ষায় () প্রয়োগ করুন
ইটান পিয়ার

এটি কাজ করে না। আমি সুযোগ যুক্ত করেছি $ প্রয়োগ (); অনুরোধ কল করার পরেইনোটিকেশন চ্যানেল.ডিলেটমেসেজ (1, 4) কিন্তু আমি একই ত্রুটি
পেয়েছি

আমি একই ত্রুটিটি পাই যখন অ্যাসিঙ্ক পরীক্ষাগুলি Jestপ্রত্যাশার চেয়ে বেশি সময় নেয় - ডিবাগ করার সময় এবং ভেরিয়েবলগুলি পরিদর্শন করতে কিছুটা সময় নেওয়ার সময় খুব সাধারণ।
ড্যান ড্যাসক্লেস্কু

পরিবর্তে কম সময়সীমা ব্যবহার করার চেষ্টা করুন। টাইমআউট = 5000 ব্যবহার করার সময় আমি এই ত্রুটিটি পেয়েছি 2000 আমি এটি 2000 এর সাথে প্রতিস্থাপন করেছি এবং এটি আমার পক্ষে কাজ করেছে!
মেরিনা রিয়াজ

1
আমার জুতোতে কাউকে সহায়তা করার জন্য এটি এখানে রেখে। ডকারের ধারকটির ভিতরে পরীক্ষা চালানোর সময় আমার এই ত্রুটি হয়েছিল। টেস্টগুলি কখনও কখনও কোনও সমস্যা ছাড়াই পাস হত তবে কখনও কখনও ব্যর্থ হয়। আমি অনুভব করেছি এটি এক ধরণের রেস শর্ত ছিল তবে কেন তা বুঝতে পারিনি। আমি বুঝতে পেরেছিলাম যে আমার একটি afterEachপদক্ষেপ ছিল যা ডাটাবেস সাফ করছিল ( deleteManyপদ্ধতিটি ব্যবহার করে )। পদ্ধতিটিতে যুক্ত jest.setTimeout(30000);করা beforeAllআমার কাছে এটি স্থির করে দিয়েছে বলে মনে হচ্ছে - আমি অনুমান করছি যেহেতু ডাটাবেস মুছে ফেলা একটি নেটওয়ার্ক কল (শর্তের অভ্যন্তরে), এটি কখনও কখনও 3 সেকেন্ডেরও বেশি সময় নেয় এবং নিক্ষেপ করে।
এনখিল

উত্তর:


231

আপনার itফাংশনে একটি তর্ক ( doneনীচের কোডে) থাকার কারণে জেসমিন একটি অ্যাসিঙ্ক কল চেষ্টা করবে।

//this block signature will trigger async behavior.
it("should work", function(done){
  //...
});

//this block signature will run synchronously
it("should work", function(){
  //...
});

doneযুক্তিটির নাম কী তাতে কোনও পার্থক্য হয় না , এর অস্তিত্বই এটি গুরুত্বপূর্ণ। আমি খুব বেশি অনুলিপি / পাস্তা থেকে এই সমস্যাটিতে চলে এসেছি।

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


3
বর্ণনার ক্ষেত্রে একইভাবে সত্য (
কৌণিকভাবে,

: @MartinBliss এটা নথিভুক্ত করা হয়, আমি প্রস্তাবিত থাকেন justed একটি সম্পাদনা ডকুমেন্টেশন উল্লেখ করতে stackoverflow.com/suggested-edits/2434606
ভিনসেন্ট

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

এটি আমার সমস্যার সমাধান করেছে এবং এটি একই কাপল্রিট "অনুলিপি / পাস্তা" এর কারণে হয়েছিল
শাইখ

1
@ ভিনসেন্ট প্রোটেক্টর ব্যবহারকারীরা কি ইস্যু করে যদি এই ত্রুটিটি ঘটে?
ব্রুনো বিয়েরি

57

এমনকি অ্যাসিঙ্ক পরীক্ষার জন্যও এই ক্ষেত্রে একটি সময়সীমা শেষ হয়ে যায়, আপনি কোনও অ্যাসিঙ্ক জেসমিন কলব্যাক মূল্যায়ন করার জন্য সীমা সীমাবদ্ধতার মান বাড়িয়ে এই ত্রুটিটি ঘিরে কাজ করতে পারেন

describe('Helper', function () {
    var originalTimeout;

    beforeEach(function() {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000000;
    });

    afterEach(function() {
      jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
    });

    it('Template advance', function(doneFn) {
        $.ajax({
            url: 'public/your-end-point.mock.json',
            dataType: 'json',
            success: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            },
            error: function (data, response) {
                // Here your expected using data
                expect(1).toBe(1)
                doneFn();
            }
        });
    });
});

সূত্র: http://jasmine.github.io/2.0/introduction.html#section-42


1
এটি এটি করার মতো "সঠিক উপায়ে" নয় বলে মনে হচ্ছে, তবে আমার সেলেনিয়াম পরীক্ষাটি চালানোর জন্য বেশ কয়েকটি অতিরিক্ত শূন্য যুক্ত করার পরে এটি একটি প্রয়োজনীয় হ্যাক ছিল।
এমেরি

আসল জুঁই DE ডিএএফএএল.এল.এফ.আই.টি.এম.ইউ। সুতরাং এই উদাহরণটি এটি এটিকে ছয়গুণ ছোট করে তুলবে।
ওয়ালটারি

আপনি ঠিক বলেছেন আমি এই উদাহরণে কেবল একটি এলোমেলো সংখ্যা
রেখেছি

20

কোনও সার্ভিস / কারখানা শুরু করার সময় বা যাই হোক না কেন ইনজেকশনের বাইরে রেখেও এই ত্রুটি ঘটতে পারে। উদাহরণস্বরূপ, এটি করে এটি নিক্ষেপ করা যেতে পারে:

var service;
beforeEach(function(_TestService_) {
    service = _TestService_;
});

এটি ঠিক করার জন্য পরিষেবাটি সঠিকভাবে পুনরুদ্ধার করতে কেবল ইনজেকশনের সাথে ফাংশনটি মুড়িয়ে দিন:

var service;
beforeEach(inject(function(_TestService_) {
    service = _TestService_;
}));

13
import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing';

নকলআসাইক ব্যবহার করুন

beforeEach(fakeAsync (() => {

//your code

}));



describe('Intilalize', () => {
        it('should have a defined component', fakeAsync(() => {
            createComponent();
            expect(_AddComponent.ngOnInit).toBeDefined();
        }));
    });

6

আপনি কর্ম-জুঁই ব্যবহার করতে পারেন বিশ্বব্যাপী ডিফল্ট সময় নির্ধারণের প্লাগইন ।

এই কনফিগারেশনটি karma.conf.js এ যুক্ত করুন

module.exports = function(config) {
  config.set({
    client: {
      jasmine: {
        timeoutInterval: 10000
      }
    }
  })
}

5

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

আমাকে জিজ্ঞাসা করবেন না কেন, আমি জানি না। তবে আমার পরিস্থিতিতে এটি ত্রুটিযুক্ত সিস্টেমের সংস্থানগুলির অভাব বলে মনে হয়েছিল।


5
সম্ভবত, যখন আপনার সিপিইউ বিনামূল্যে ছিল, তখন কার্যটি ডিফল্ট সময়সীমা শেষ হওয়ার আগেই শেষ হয়েছিল। সিপিইউ ব্যস্ত থাকাকালীন আপনি যে কাজটি পরীক্ষা করছেন তা শেষ হতে খুব বেশি সময় নিয়েছে।
শেন

5

এটি উত্তরের চেয়ে একটি পর্যবেক্ষণের চেয়ে বেশি, তবে এটি অন্যদের যারা আমার মতো হতাশাগ্রস্থ ছিলেন তাদের সহায়তা করতে পারে।

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

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

কী কারণে এটি হয়েছে, বা কীভাবে এটি ঠিক করা যায় সে সম্পর্কে কোনও ধারণা নেই তবে কার্যকারী ডিরেক্টরিটি মুছে ফেলা এবং এটি যাচাই করা হয়েছে তা যাচাই করে ফেলেছে।

আশা করি এটি কাউকে সাহায্য করবে।


1
থ্যাঙ্ক ইউ ম্যান, আমি এ নিয়ে পাগল হয়ে যাচ্ছিলাম। আমি আমার পিসি রিবুট করেছি এবং এটি ছিল
yngrdyn

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

4

ব্যবহার করবেন না done, কেবল ফাংশন কলটি খালি ছেড়ে দিন।


আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন তবে আমি বুঝতে পেরেছি যে পরীক্ষার স্যুটটি খুব পরীক্ষার আগেই শেষ করে দেয় এবং এর পরিবর্তে ত্রুটি বার্তাটি ফেলে দেওয়া হয়। যার অর্থ হ'ল আসলটি চালানোর আগে টেস্ট স্যুটটি শেষ হওয়ার সাথে সাথে ব্যর্থ হওয়া যে কোনও দাবিতে পরীক্ষা ভাঙবে না। এর অর্থও হতে পারে (আমি অনুরূপ আচরণ দেখেছি) যে অন্য একটি পরীক্ষা এই পরীক্ষাটি তৈরি করে ত্রুটি দেখায়। শেষ অবধি এর অর্থ হ'ল সবকিছু দিয়ে ঠিক করা ঠিক আছে তবে পরীক্ষার সংখ্যা বাড়ার সাথে সাথে সমস্যাটি মাঝেমধ্যে পপ আপ হবে।
লসমানোস

3

beforeAllফাংশনে কিছু প্রত্যাশা করার সময় আপনি এই ত্রুটিটি পান !

describe('...', function () {

    beforeAll(function () {
        ...

        expect(element(by.css('[id="title"]')).isDisplayed()).toBe(true);
    });

    it('should successfully ...', function () {

    }
}

2

আমার ক্ষেত্রে, এই ত্রুটিটি "ফিক্সচার.ডেসটেক্ট চেঞ্জস ()" এর ভুল ব্যবহারের কারণে ঘটেছিল বলে মনে হয় এই পদ্ধতিটি একটি ইভেন্ট শ্রোতা (অ্যাসিঙ্ক) যা পরিবর্তনগুলি সনাক্ত করার পরে কেবল একটি কলব্যাক প্রতিক্রিয়া জানায়। যদি কোনও পরিবর্তন সনাক্ত না করা হয় তবে এটি কলব্যাক ডাকে না, ফলস্বরূপ একটি টাইমআউট ত্রুটি হয়। আশাকরি এটা সাহায্য করবে :)


2

scopeরেফারেন্স এবং ফাংশন আর্গুমেন্ট অপসারণ পরে কাজ করে:

"use strict";

describe("Request Notification Channel", function() {
    var requestNotificationChannel, rootScope;

    beforeEach(function() {
        module("messageAppModule");

        inject(function($injector, _requestNotificationChannel_) {
            rootScope = $injector.get("$rootScope");
            requestNotificationChannel = _requestNotificationChannel_;
        })
        spyOn(rootScope, "$broadcast");
    });


    it("should broadcast delete message notification with provided params", function() {
        requestNotificationChannel.deleteMessage(1, 4);
        expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4} );
    });
});

0

যেমনটি @ মস্তব্লাস্টা দ্বারা উল্লিখিত হয়েছে, তবে এটি যুক্ত করার জন্য আপনি যদি 'সম্পন্ন' যুক্তিটি কল করেন বা এটির নামটি সম্পন্ন করেন তবে এটি সম্পন্ন হওয়ার পরে আপনার পরীক্ষায় কেবল কলব্যাকটি সম্পূর্ণ () কল করুন।

// this block signature will trigger async behavior.
it("should work", function(done){
  // do stuff and then call done...
  done();
});

// this block signature will run synchronously
it("should work", function(){
  //...
});

0

জুঁই.ডিএএফএএল.এল.এফ.এল.আই.টি.এম.ইউT_INTERVAL = 100000;

এটিকে অবরুদ্ধ করে রাখা আমার সমস্যার সমাধান করে।

it('', () => {
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
});

0

আমি যা করলাম তা হল: নিম্নলিখিত কোডটি যুক্ত / আপডেট হয়েছে:

framework: 'jasmine',
jasmineNodeOpts: 
{
    // Jasmine default timeout
    defaultTimeoutInterval: 60000,
    expectationResultHandler(passed, assertion) 
    {
      // do something
    },
}

3
এই কোডটি কেন কাজ করে তা ব্যাখ্যা না করে কেবল পোস্ট ছাড়াই দয়া করে ব্যাখ্যা করুন।
কোবে

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

2
ঠিক আছে, এখন এটি পোস্ট করুন যা আপনার পোস্টে রয়েছে; আপনার কোনও ব্যাখ্যা ছাড়াই কোড সহ উত্তর দেওয়া এড়াতে চেষ্টা করা উচিত :)
কোবে


0

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

প্রথমে দেখুন আপনার "এটি" দৃশ্যে ভুয়াএসিঙ্ক ব্যবহার করছেন কিনা:

it('should do something', fakeAsync(() => {

আপনি flush()মাইক্রো টাস্কের সারিটি শেষ করতে বা tick()নির্দিষ্ট সময় অপেক্ষা করতে অপেক্ষা করতে পারেন use


-2

যদি ফাংশনে আপনার কোনও যুক্তি ( done) থাকে তবে itএটি মুছে ফেলার চেষ্টা করুন পাশাপাশি এটি ফাংশনের মধ্যেই কল রয়েছে:

it("should broadcast delete message notification", function(/*done -> YOU SHOULD REMOVE IT */) {

    requestNotificationChannel.deleteMessage(1, 4);
    expect(rootScope.$broadcast).toHaveBeenCalledWith("_DELETE_MESSAGE_", { id: 1, index: 4 });
    // done(); -> YOU SHOULD REMOVE IT        
});

4
এই উত্তরটি কেন এটি কার্যকর নয় তার কোনও ব্যাখ্যা ছাড়াই।
গ্যারি

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