簡體   English   中英

角質/茉莉花:錯誤:預期的間諜已被召喚

[英]angular/jasmine: Error: Expected spy to have been called

該代碼位於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。 如果有人能看到測試出了什么問題給我該錯誤,將不勝感激! 提前謝謝了!

你應該解決以下承諾( deferredSession沿) neutron一個,否則將無法進去.thenuserSession.get().then(getQoSPolicies)

var deferredSession = $q.defer();
spyOn(session, 'get').and.returnValue(deferredSession.promise);
...
...

deferredSession.resolve({});
deferred.resolve(...);
$timeout.flush();

解決現有問題,它應該可以按預期工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM