jasmine: асинхронный обратный вызов не был вызван в течение времени ожидания, указанного в jasmine.DEFAULT_TIMEOUT_INTERVAL

У меня есть угловой сервис, который называется 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();       
    });
});

Я читал об асинхронной поддержке в Jasmine, но, поскольку я довольно новичок в модульном тестировании с использованием javascript, не смог заставить его работать.

Я получаю сообщение об ошибке:

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

и мой тест выполняется слишком долго (около 5 с).

Может ли кто-нибудь помочь мне предоставить рабочий пример моего кода с некоторыми пояснениями?

104 голоса | спросил Mdb 24 MarpmMon, 24 Mar 2014 12:48:16 +04002014-03-24T12:48:16+04:0012 2014, 12:48:16

12 ответов


0

Наличие аргумента в вашей функции it приведет к попытке асинхронного вызова.

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

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

Не имеет значения, как назван аргумент done, его существование - все, что имеет значение. Я столкнулся с этой проблемой из-за слишком большого количества копий /пасты.

Документы Jasmin Asynchronous Support отмечают этот аргумент (названный done выше) - это обратный вызов, который можно вызвать, чтобы сообщить Jasmine о завершении асинхронной функции. Если вы никогда не позвоните, Жасмин никогда не узнает, что ваш тест завершен, и в конечном итоге истечет время ожидания.

ответил mastaBlasta 13 AM000000120000001831 2014, 00:02:18
0

В качестве обходного пути вы можете увеличить ограничение времени ожидания для оценки асинхронного обратного вызова Jasmine

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

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

    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 # раздел-42

ответил gsalgadotoledo 16 AM00000020000001831 2016, 02:41:18
0

Эта ошибка также может быть вызвана пропуском inject при инициализации службы /фабрики или чего-либо еще. Например, это можно сделать, выполнив это:

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

Чтобы исправить это, просто оберните функцию с помощью inject, чтобы правильно получить службу:

    var service;
    beforeEach(inject(function(_TestService_) {
        service = _TestService_;
    }));
ответил Katana24 25 32015vEurope/Moscow11bEurope/MoscowWed, 25 Nov 2015 14:10:12 +0300 2015, 14:10:12
0
import { fakeAsync, ComponentFixture, TestBed } from '@angular/core/testing';

используйте fakeAsync

beforeEach(fakeAsync (() => {

//your code

}));



describe('Intilalize', () => {
        it('should have a defined component', fakeAsync(() => {
            createComponent();
            expect(_AddComponent.ngOnInit).toBeDefined();
        }));
    });
ответил Lijo 2 FebruaryEurope/MoscowbFri, 02 Feb 2018 16:34:29 +0300000000pmFri, 02 Feb 2018 16:34:29 +030018 2018, 16:34:29
0

Эта ошибка началась для меня неожиданно, в тесте, который всегда работал. Я не мог найти никаких предложений, которые помогли, пока я не заметил, что мой Macbook работает медленно. Я заметил, что процессор был привязан другим процессом, который я убил. Асинхронная ошибка Jasmine исчезла, и мои тесты снова в порядке.

Не спрашивай меня почему, я не знаю. Но в моих обстоятельствах это было похоже на недостаток системных ресурсов по вине.

ответил Eric Soyke 27 FebruaryEurope/MoscowbMon, 27 Feb 2017 19:28:38 +0300000000pmMon, 27 Feb 2017 19:28:38 +030017 2017, 19:28:38
0

Вы также получаете эту ошибку, ожидая чего-то в функции beforeAll!

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

    beforeAll(function () {
        ...

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

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

    }
}
ответил Tom Van Rossom 30 42017vEurope/Moscow11bEurope/MoscowThu, 30 Nov 2017 14:11:48 +0300 2017, 14:11:48
0

Работает после удаления ссылки 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} );
        });
    });
ответил Tom Van Rossom 30 42017vEurope/Moscow11bEurope/MoscowThu, 30 Nov 2017 14:11:48 +0300 2017, 14:11:48
0

В моем случае эта ошибка была вызвана неправильным использованием «fixture.detectChanges ()». Кажется, этот метод является прослушивателем событий (асинхронным), который будет отвечать на обратный вызов только при обнаружении изменений. Если никаких изменений не обнаружено, он не будет вызывать обратный вызов, что приведет к ошибке тайм-аута. Надеюсь, это поможет:)

ответил A. Figueroa 14 J0000006Europe/Moscow 2018, 21:43:02
0

Это скорее наблюдение, чем ответ, но оно может помочь другим, которые были так же разочарованы, как и я.

Я продолжал получать эту ошибку из двух тестов в моем наборе. Я думал, что просто сломал тесты с помощью рефакторинга, который я делал, поэтому после возврата изменений не сработал, я вернулся к более раннему коду, дважды (две ревизии назад), думая, что это избавит от ошибки. Это ничего не изменило. Я преследовал свой хвост весь день вчера и часть этого утра, не решая проблему.

Сегодня утром я расстроился и проверил код на ноутбуке. Запустил весь набор тестов (около 180 тестов), ошибок нет. Таким образом, ошибки никогда не были в коде или тестах. Вернулся к моему устройству разработки и перезагрузил его, чтобы очистить все, что в памяти могло вызвать проблему. Без изменений, те же ошибки на тех же двух тестах. Поэтому я удалил каталог со своего компьютера и проверил его обратно. Вуаля! Нет ошибок.

Не знаю, что вызвало это или как это исправить, но удаление рабочего каталога и его восстановление исправили все, что было.

Надеюсь, это кому-нибудь поможет.

ответил delliottg 22 J0000006Europe/Moscow 2018, 20:41:58
0
  

Как заметил @mastablasta, но также добавим, что если вы вызываете аргумент 'done' или, скорее, называете его complete , вы просто вызываете callback complete () в своем тесте, когда он закончится.

// 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(){
  //...
});
ответил SoEzPz 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 13 Sep 2018 00:23:13 +0300 2018, 00:23:13
0

jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;

Хранение этого в блоке решило мою проблему.

it('', () => {
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;
});
ответил Sai Prasad 12 WedEurope/Moscow2018-12-12T10:11:11+03:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2018 10:11:11 +0300 2018, 10:11:11
0
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        
});
ответил tiagor87 11 +03002016-10-11T16:23:00+03:00312016bEurope/MoscowTue, 11 Oct 2016 16:23:00 +0300 2016, 16:23:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132