Тестирование обещания Angular с жасмином

Следующий тест продолжает терпеть неудачу, и я не могу понять, почему? Я пытаюсь выяснить, как тестировать дефериды / promises с Жасмином.

Ошибка

Expected undefined to be 'Resolved Data'.

Тест

    describe('Queued Repository', function () {
    var ctrl,
        rootScope,
        scope,
        service;

    beforeEach(function () {
        module('testApp');

        inject(function ($rootScope, $controller, TestSrvc) {
            rootScope = $rootScope;
            scope = $rootScope.$new();
            service = TestSrvc;
        });
    });

    afterEach(inject(function ($rootScope) {
        $rootScope.$apply();
    }));

    it('test something', function () {
        expect(service.calculate(1, 5)).toBe(6);
    });

    it('resolves promises', function () {
        var result;

        service.getPromise().then(function (data) {
            result = data;
        });

        rootScope.$apply();
        expect(result).toBe('Resolved Data');
    });
});

Сервис

    var app = angular.module('testApp', []);

app.service('TestSrvc', ['$q', '$timeout', '$http', function ($q, $timeout, $http) {
    return {
        getPromise: function () {
            var d = $q.defer();

            $timeout(function () {
                d.resolve('Defered Result');
            }, 5000);

            return d.promise;
        },
        getSomething: function () {
            return "Test";
        },
        calculate: function (x, y) {
            return x + y;
        }
    }
}]);

Ответы

Ответ 1

Попробуйте позвонить $timeout.flush() до expect(result).toBe('Resolved Data');.

Ответ 2

В вашем примере вам нужно позвонить как $timeout.flush() AND $rootScope.$apply().

Объяснение: $timeout.flush() заставит ваш $timeout в службе запускаться немедленно. Затем ваша служба вызовет "resolve", но promise.then() не будет вызываться до следующего цикла дайджест; поэтому вам нужно будет вызвать $rootScope.$apply() для распространения любых "разрешений" и "часов", которые будут происходить синхронно.

NOTE: В Jasmine убедитесь, что ваша функция promise.then() показывает BEFORE ваш вызов $rootScope.$apply, иначе он не будет запускать функцию promise.then(). (Я не понял, почему это происходит в Жасмине.)