angular / jasmine:错误:被调用的预期间谍

时间:2017-04-11 10:37:28

标签: javascript angularjs jasmine

此处的代码存在https://review.openstack.org/#/c/418828/,但我将在下面详细介绍:

我正在为这段特殊代码编写测试:https://review.openstack.org/#/c/418828/26/openstack_dashboard/static/app/core/network_qos/qos.service.js

(function() {
  "use strict";

  angular.module('horizon.app.core.network_qos')
    .factory('horizon.app.core.network_qos.service', qosService);

  qosService.$inject = [
    '$filter',
    'horizon.app.core.openstack-service-api.neutron',
    'horizon.app.core.openstack-service-api.userSession'
  ];

  /*
  * @ngdoc factory
  * @name horizon.app.core.network_qos.service
  *
  * @description
  * This service provides functions that are used through the QoS
  * features.  These are primarily used in the module registrations
  * but do not need to be restricted to such use.  Each exposed function
  * is documented below.
  */
  function qosService($filter, neutron, userSession) {
    var version;

    return {
      getPolicyPromise: getPolicyPromise,
      getPoliciesPromise: getPoliciesPromise
    };

     /*
      * @ngdoc function
      * @name getPoliciesPromise
      * @description
      * Given filter/query parameters, returns a promise for the matching
      * policies.  This is used in displaying lists of policies.  In this case,
      * we need to modify the API's response by adding a composite value called
      * 'trackBy' to assist the display mechanism when updating rows.
      */
    function getPoliciesPromise(params) {
      return userSession.get().then(getQoSPolicies);

      function getQoSPolicies() {
        return neutron.getQoSPolicies(params).then(modifyResponse);
      }

      function modifyResponse(response) {
        return {data: {items: response.data.items.map(modifyQos)}};

        function modifyQos(policy) {
          policy.trackBy = policy.id;
          policy.apiVersion = version;
          policy.name = policy.name || policy.id;
          return policy;
        }
      }
    }

    /*
    * @ngdoc function
    * @name getPolicyPromise
    * @description
    * Given an id, returns a promise for the policy data.
    */
    function getPolicyPromise(identifier) {
      neutron.getVersion().then(setVersion);
      return neutron.getQosPolicy(identifier).then(modifyResponse);

      function modifyResponse(response) {
        response.data.apiVersion = version;
        return {data: response.data};
      }
    }
  }

})();

这是我目前的测试文件:

 (function() {
  "use strict";

  describe('qosService', function() {
    var service;
    beforeEach(module('horizon.app.core'));
    beforeEach(inject(function($injector) {
      service = $injector.get('horizon.app.core.network_qos.service');
    }));

    describe('getPoliciesPromise', function() {
      it("provides a promise that gets translated", inject(function($q, $injector, $timeout) {
        var neutron = $injector.get('horizon.app.core.openstack-service-api.neutron');
        var session = $injector.get('horizon.app.core.openstack-service-api.userSession');
        var deferred = $q.defer();
        var deferredSession = $q.defer();
        spyOn(neutron, 'getQoSPolicies').and.returnValue(deferred.promise);
        spyOn(session, 'get').and.returnValue(deferredSession.promise);
        var result = service.getPoliciesPromise({});
        deferred.resolve({
          data: {
            items: [{id: 123, name: 'policy1'}]
          }
        });
        $timeout.flush();
        expect(neutron.getQoSPolicies).toHaveBeenCalled();
        expect(result.$$state.value.data.items[0].name).toBe('policy1');
      }));
    });

  });

})();

当我运行测试时,我目前得到的错误是:

Expected spy getQoSPolicies to have been called.

如您所见,绝对会调用getQoSPolicies。如果有人能看到测试有什么问题给我这个错误,我将不胜感激!非常感谢提前!

1 个答案:

答案 0 :(得分:2)

您应该解决以下承诺(deferredSession)和neutron一个承诺,或者它不会进入.then的{​​{1}}内:

userSession.get().then(getQoSPolicies)

将其与现有文件一起解决,它应该按预期工作!