在链式承诺上创建茉莉花间谍

Create jasmine spy on chained promise

我想测试一个基于 Restangular 的服务。问题是我找不到在链式承诺上创建正确间谍的方法。

var services = angular.module('services.dashboards', ['models.dashboards', 'models.metrics', 'LocalStorageModule', 'app.filters']);

services.factory('DashboardsService', ['Restangular', '$q', 'Metrics', 'Dashboards', 'localStorageService', '$filter', 'filterByGradedFilter', function (Restangular, $q, Metrics, Dashboards, localStorageService, $filter, filterByGradedFilter) {
    var factory = {};

    factory.getData = function () {
        var defer = $q.defer();
        var data = localStorageService.get('data');
        if (!data) {
            Dashboards.post()
                .then(function (result) {
                    return Restangular.oneUrl('newDash', result.data).get();
                })
                .then(function (result) {
                    data = result.data;
                    localStorageService.set('data', data);
                    defer.resolve(data);
                });
        } else {
            defer.resolve(data);
        }
        return defer.promise;
    }

    return factory;

}]);

我要测试的链式承诺是:

            Dashboards.post()
                .then(function (result) {
                    return Restangular.oneUrl('newDash', result.data).get();
                })
                .then(function (result) {
                    data = result.data;
                    localStorageService.set('data', data);
                    defer.resolve(data);
                });

测试是 运行 但我得到一个错误:Error: get() method does not exist:

describe('Dashboards Service', function () {

    // Holds the service under test
    var service;
    // Dependencies
    var dashboards;
    var restangular;
    var q;
    var rootScope;

    beforeEach(module('services.dashboards'));

    // We inject the service
    beforeEach(inject(function (_DashboardsService_, _Dashboards_, _Restangular_, _$q_, _$rootScope_) {
        service = _DashboardsService_;
        dashboards = _Dashboards_;
        restangular = _Restangular_;
        q = _$q_;
        rootScope = _$rootScope_
    }));

    describe('#getData', function ($rootScope) {
        it('should get a dashboard', function () {
            spyOn(dashboards, 'post').and.returnValue(q.when({}));
            // Tried that but it's not working
            spyOn(restangular, 'oneUrl').and.callFake(function() {
                return this;
                // Also tried return restangular;
            });
            spyOn(restangular, 'get').and.returnValue(q.when({}));
            service.getData().then(function (result) {
                expect(result).toEqual({});
            });

            expect(dashboards.post).toHaveBeenCalled();
            expect(restangular.oneUrl).toHaveBeenCalledWith('newDash');
            expect(restangular.oneUrl.get).toHaveBeenCalled();
            rootScope.$apply();

        })
    })
})

你能试试这个吗

 spyOn(restangular, 'oneUrl').and.callFake(function() {
               return {
                    get:function() {return q.when({});}
               }
            });

基本上你需要 return 具有 get 方法的对象,return 是承诺或数据。