Как внедрить и смоделировать $ http с помощью $ httpBackend в модульных тестах AngularJS? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь проверить следующий метод:

function get(url, options) {
    var headers = {
      'X-Request-ID': main.guid(),
      'X-Tenant-ID': tenantId
    };
    if (options.headers) {
      headers = Object.assign(headers, options.headers);
    }
    var responseType = options.responseType || undefined;
    return $http
      .get(url, {headers: headers, responseType: responseType})
      .then(function(response) {
        if (options.transformResponse) {
          options.transformResponse(response);
        }
        return response.data;
      })
      .catch(function(reason) {
        if (options.is404Logged === false && reason.status === 404) {
          return;
        }
        exceptionService.handleError(reason);
      });
  }

Вот два моих теста.Я хочу проверить, что метод exceptionService.handleError вызывается или не вызывается в зависимости от переданного объекта options. Другими словами, я пытаюсь проверить, что происходит в блоке catch в методе выше.

describe("httpClientService", function() {
  var httpClientService, exceptionService, $httpBackend;

  beforeEach(function() {
    module("bridge.services");
  });

  describe('get()', function() {
    beforeEach(function() {
      inject(function($injector) {
        httpClientService = $injector.get('httpClientService');
        exceptionService = $injector.get('exceptionService');
        $httpBackend = $injector.get('$httpBackend');
      });
    })

    describe("404 response", function() {
      it('logs 404 when no options provided', function() {
        var url = 'https://wwww.example.com';
        var response = {
          status: 404
        };
        $httpBackend.when('get', url).respond(response);
        spyOn(exceptionService, 'handleError');

        httpClientService
          .get(url)
          .then(function() {
            expect(exceptionService.handleError).toHaveBeenCalled();
          });
      });

      it('does not log 404 when is404Logged is false', function() {
        var url = 'https://wwww.example.com';
        var options = {
          is404Logged: false
        };
        var response = {
          status: 404
        };
        $httpBackend.when('get', url).respond(response);
        spyOn(exceptionService, 'handleError');

        httpClientService
          .get(url, options)
          .then(function() {
            expect(exceptionService.handleError).not.toHaveBeenCalled();
          });
       });
    });
  });
});

По непонятным причинам, когда я запускаю свои тесты, они вообще не выполняют утверждений.Я могу поместить оператор console.log внутри блока then (в тесте), и ничего не регистрируется.Мои тесты проходят независимо от того, что я утверждаю.

Я пытался использовать whenGET вместо when на $httpBackend объекте.Я также пытался использовать $httpBackend.flush(), чтобы гарантировать, что ложный вызов API будет разрешен, когда произойдут утверждения.

Тесты «проходят», потому что утверждения не выполняются.Я хотел бы, чтобы утверждения имели место, тогда мои тесты добавят ценность.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Это решение должно работать и использует $ httpBackend и whenGET :

   describe("httpClientService", function() {
     var httpClientService, exceptionService, $httpBackend;
     var url = 'https://wwww.example.com';

     beforeEach(function() {
       module("bridge.services");
     });

     describe('get()', function() {
       beforeEach(function() {
          inject(function($injector) {
            httpClientService = $injector.get('httpClientService');
            exceptionService = $injector.get('exceptionService');
            $httpBackend = $injector.get('$httpBackend');
            spyOn(exceptionService, 'handleError');
          });
       });

       afterEach(function() {
         $httpBackend.verifyNoOutstandingExpectation();
         $httpBackend.verifyNoOutstandingRequest();
       });

       describe("404 response", function() {

         it('logs 404 when no options provided', function() {
           var response = {
             status: 404
           };

           $httpBackend.whenGET(url).respond(404, response);
           $httpBackend.expectGET(url);

           httpClientService.get(url);
           $httpBackend.flush();

           expect(exceptionService.handleError).toHaveBeenCalled();
         });
       });
     });
   });
0 голосов
/ 22 декабря 2018

Я считаю, что это должно работать для вас

describe("httpClientService", function() {
  var httpClientService, exceptionService, $httpBackend;

  beforeEach(function() {
    module("bridge.services");
  });

  describe('get()', function() {
    let url = 'https://wwww.example.com';

    beforeEach(function() {
      inject(function($injector) {
        httpClientService = $injector.get('httpClientService');
        exceptionService = $injector.get('exceptionService');
        $httpBackend = $injector.get('$httpBackend');

       spyOn(exceptionService, 'handleError');
      });
    })

    afterEach(() => {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });


    describe("404 response", function() {
      it('logs 404 when no options provided', function() {
        var response = {
          status: 404
        };
        $httpBackend.when('get', url).respond(response);

        httpClientService.get(url);
        $httpBackend.flush();
        expect(exceptionService.handleError).toHaveBeenCalled();
      });

      it('does not log 404 when is404Logged is false', function() {
        var options = {
          is404Logged: false
        };
        var response = {
          status: 404
        };
        $httpBackend.when('get', url).respond(response);

        httpClientService.get(url, options);
        $httpBackend.flush();
        expect(exceptionService.handleError).not.toHaveBeenCalled();
       });
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...