无法从 angular 服务获得承诺结果

can't get promise result from angular service

我正在尝试模拟我正在使用的服务,应该 return 一个承诺,正在调用模拟服务,但我无法将结果用于我的测试。

待测服务功能:

function getDevices() {
            console.log('getDevices');
            return servicesUtils.doGetByDefaultTimeInterval('devices')
                .then(getDevicesComplete);

            function getDevicesComplete(data) {
                console.log('getDevicesComplete');
                var devices = data.data.result;
                return devices;
            }
        }

我的测试是:

describe('devicesService tests', function () {
    var devicesService;
    var servicesUtils, $q, $rootScope;

    beforeEach(function () {
        servicesUtils = {};

        module('app.core', function ($provide) {
            servicesUtils = specHelper.mockServiceUtils($provide, $q, $rootScope);
        });

        inject(function (_devicesService_, _$q_, _$rootScope_) {
            devicesService = _devicesService_;
            $q = _$q_;
            $rootScope = _$rootScope_.$new();
        });
    });

    it('getting device list', function () {
        console.log('getting device list');
        devicesService.getDevices().then(function (result) {
            console.log(result);
            expect(result).toBeDefined();
        });    
    });
});

模拟文件:

function mockServiceUtils($provide, $q) {
        var servicesUtils = {};
        servicesUtils.doGetByDefaultTimeInterval = jasmine.createSpy().and.callFake(function() {
            var deferred = $q.defer();
            deferred.resolve('Remote call result');
            $rootScope.$digest();
            return deferred.promise;
        });

        $provide.value('servicesUtils', servicesUtils);

        return servicesUtils;
    }

您的代码太复杂了。

假设您要测试使用另一个服务 servicesUtils 的服务 devicesService,并有一个 returns 承诺的方法。 让我们假设 devicesService 的职责是调用 servicesUtils 并转换其结果。

我会这样做:

describe('devicesService', function() {

  var devicesService, servicesUtils;

  beforeEach(module('app.core'));
  beforeEach(inject(function(_devicesService_, _servicesUtils_) {
    devicesService = _devicesService_;
    servicesUtils = _servicesUtils_;
  }));

  it('should get devices', inject(function($q, $rootScope) {
    spyOn(servicesUtils, 'doGetByDefaultTimeInterval').and.returnValue($q.when('Remote call result'));

    var actualResult;
    devicesService.getDevices().then(function(result) {
      actualResult = result;
    });
    $rootScope.$apply();

    expect(actualResult).toEqual('The transformed Remote call result');
  }));
});