代码之家  ›  专栏  ›  技术社区  ›  Pop-A-Stash

测试Karma中的角服务:相同的测试,不同的结果

  •  0
  • Pop-A-Stash  · 技术社区  · 8 年前

    我正在尝试用Karma测试Angular服务,结果很奇怪,所以我做了两个相同的测试,看看是否能得到相同的结果,但我没有:

    describe('Profile Data Service', function() {
      var LoginData, rootScope, $httpBackend;
      beforeEach(module('myApp'));
    
      describe('get profile data', function() {
        beforeEach(inject(function(_LoginData_, $rootScope, _$httpBackend_) {
          LoginData = _LoginData_;
          LoginData.username= "jsmith";
          LoginData.token = "token";
    
          rootScope = $rootScope;
    
          $httpBackend = _$httpBackend_;
    
        }));
    
        it('should get profile data on instantiation', inject(function(ProfileDataService) {
          $httpBackend.expect('POST', 'http://mytestserver.com/api/', {
            params: [{
              username: "jsmith",
              token: "token",
              method: "getProfile"
            }]
          })
          .respond({
            result: {
              address: "111 Main St."
              city: "Los Angeles",
              state: "CA"
            }
          });
          $httpBackend.flush();
          expect(ProfileDataService.profileData.address).toMatch("111 Main St.");
        }));
    
        it('should get profile data on instantiation', inject(function(ProfileDataService) {
          $httpBackend.expect('POST', 'http://mytestserver.com/api/', {
            params: [{
              username: "jsmith",
              token: "token",
              method: "getProfile"
            }]
          })
          .respond({
            result: {
              address: "111 Main St."
              city: "Los Angeles",
              state: "CA"
            }
          });
          $httpBackend.flush();
          expect(ProfileDataService.profileData.address).toMatch("111 Main St.");
        }));
      });
    });
    

    第一个测试通过了,但第二个测试表明profileData未定义。它们是相同的测试。我假设每个 it ProfileDataService正在重新初始化,但情况可能并非如此。如果不是这样,我该如何创建单独的测试,以便销毁我的服务并为每个测试用例重新初始化?

    该服务的逻辑相当简单:

    (function() {
      'use strict';
      angular.module('servicesModule')
      .service('ProfileDataService', ProfileDataService);
    
      ProfileDataService.$inject = ["$http", "$q", "LoginData", "CacheFactory"];
    
      function ProfileDataService($http, $q, LoginData, CacheFactory) {
        var ProfileDataService = this;
        (function() {
          init();
        })();
    
        function init() {
          getProfile().then(function(profileData) {
            ProileDataService.profileData = profileData;
          });
        }
    
        function getProfile() {
          var deferred = $q.defer();
          var data = {
            params: [{
              username: LoginData.username,
              token: LoginData.token,
              method: "getProfile"
            }]
          };
          var profileDataCache = CacheFactory.get('profileDataCache');
    
          if (profileDataCache.get('profileData') && !invalidateCache) {
            deferred.resolve(profileDataCache.get('profileData'));
          }
          else {
            $http.post('http://mytestserver.com/api/', data)
            .success(function(data) {
              profileDataCache.put('profileData', response.result);
              deferred.resolve(data.result);
            });
          }
          return deferred.promise;
        }
      }
    })();
    

    我还应该注意到,我已经尝试添加 rootScope.$digest()

    angular-cache 。我忘了提到我正在使用缓存插件。这就是我问题的原因。在创建了一个plunker并看到我在相同的测试中得到了一致的结果后,我知道有一些事情我没有意识到。由于我的缓存逻辑,第二个测试没有发出POST请求。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Pop-A-Stash    8 年前

    我的问题是没有意识到,我对缓存的使用给了我每个测试不同的结果。特别是,如果已经为该响应保存了缓存,我的服务逻辑将阻止第二次POST到api。