Angular Jasmine test response interceptor

后端 未结 2 1200
Happy的楠姐
Happy的楠姐 2020-12-30 07:32

I\'m trying to test my response interceptor but I have a hard time figuring out how to mock the $window object. Here is my interceptor code :

\'use strict\'         


        
2条回答
  •  死守一世寂寞
    2020-12-30 08:17

    You should structure your interceptor definition using the more recent syntax. Your URL construction should also be in a service so that it can easily be mocked in tests.

    .factory('UnauthorizedInterceptor', function($q, $window, OtherService) {
      var service = {
        responseError: handleUnauthorized
      };
    
      return service;
    
      function handleUnauthorized(rejection) {
        if (rejection.status === 401) {
          $window.location.href = OtherService.getUnauthorizedRedirectURL();
        }
        return $q.reject(rejection);
      }
    });
    

    Doing so will let you test it just like any other factory without having to worry about the internal implementations of $http interceptors, or having to mock responses with $httpBackend.

    describe('Domain.handlers.response', function() {
      var $window,
          UnauthorizedInterceptor,
          OtherService,
          redirectUrl = 'someUrl';
    
      beforeEach(module('Domain.handlers'));
    
      beforeEach(function () {
        $window = { location: { href: null } };
    
        module(function($provide) {
          $provide.value('$window', $window);
        });
      });
    
      beforeEach(inject(function(_UnauthorizedInterceptor_, _OtherService_) {
        UnauthorizedInterceptor = _UnauthorizedInterceptor_;
        OtherService = _OtherService_;
    
        spyOn(OtherService, 'getUnauthorizedRedirectURL').andReturn(redirectUrl);
      }));
    
      describe('UnauthorizedInterceptor', function() {
        it('should be defined', function() {
          expect(UnauthorizedInterceptor).toBeDefined();
        });
    
        it('should have a handler for responseError', function () {
          expect(angular.isFunction(UnauthorizedInterceptor.responseError)).toBe(true);
        });
    
        describe('when HTTP 401', function () {
          beforeEach(function () {
            var rejection = { status: 401 };
            UnauthorizedInterceptor.responseError(rejection);
          });
    
          it('should set window location', function () {
            expect($window.location.href).toBe(redirectUrl);
          });
        });
    
        describe('when not HTTP 401', function () {
          beforeEach(function () {
            var rejection = { status: 500 };
            UnauthorizedInterceptor.responseError(rejection);
          });
    
          it('should not set window location', function () {
            expect($window.location.href).not.toBe(redirectUrl);
          });
        });
      });
    });
    

提交回复
热议问题