Подтвердить что ты не робот

Тестирование интервала $с жасмином в PhantomJS

Похоже, что мой interval никогда не запускается.

У меня есть директива, которая содержит $interval, и я хочу ее протестировать. Я удалил весь код, связанный с директивой, и добавил его в свой контроллер:

window.called = 0;
window.interval = $interval(function () {
    window.called++;
    console.log('interval ' + window.called); // 4
}, 10);
console.log('initialized'); // 1

Тест выглядит следующим образом:

describe('myDirective', function () {
    beforeEach(module('myModule'));
    beforeEach(function($compile, $rootScope) {
        /* ... compile element in its own scope ... */
    });
    it('should run the interval', function () {
        console.log(window.interval); // 2
        waitsFor(function () {
            console.log('tick'); // 3
            return false;
        }, 1000);
    });
});

Это глупый тест. Метод waitsFor фактически возвращает false все время для целей отладки. Но это все, что я вижу на консоли:

initialized // 1
Object: {then: ..} // 2
tick // 3
tick // 3
tick // 3
tick // 3
..

и, в конечном счете, сбой теста. Я никогда не вижу ни одного interval в журналах. Что-то не так с моим кодом вообще или есть что-то особенное для Jasmine/PhantomJS, которое мне не хватает?

4b9b3361

Ответ 1

$интервал имеет макетную реализацию в angular -mocks. Убедитесь, что вы используете версию angular -моков, которая соответствует вашей версии angular.

Макет версии $interval имеет метод flush для управления тиками. См. ngMock. $Interval

Смотрите fiddle с демонстрацией:

//--- CODE --------------------------
angular.module('myModule', []).service('myModuleService', ['$interval', function ($interval) {
    var called = 0;
    $interval(function () {
        called++;
    }, 10);
    this.getCalled = function () {
        return called;
    }
}]);

// --- SPECS -------------------------

describe('test $interval', function () {

    it('calls the interval callback', function () {
        var service, $interval;
        angular.mock.module('myModule');
        angular.mock.inject(function (myModuleService, _$interval_) {
            // Initialize the service under test instance
            service = myModuleService;
            $interval = _$interval_;
        });
        expect(service.getCalled()).toEqual(0);
        $interval.flush(11);
        expect(service.getCalled()).toEqual(1);
        $interval.flush(10);
        expect(service.getCalled()).toEqual(2);
    });
});