programing

AngularJS+Jasmin: $httpBackend가 예상대로 작동하지 않습니다.

css3 2023. 10. 27. 22:05

AngularJS+Jasmin: $httpBackend가 예상대로 작동하지 않습니다.

저는 자스민카르마와 함께 사용하여 Angular 기반의 앱을 테스트하고 있습니다.

저는 사용자 데이터를 로드하는 서비스를 테스트해야 하고 $httpBackend를 사용하여 응답을 조롱하고 있습니다.그러나 테스트를 실행했을 때 두 가지 오류가 발생했습니다.

  • 오류: 플러시할 보류 중인 요청이 없습니다!
  • 오류: 불만족스러운 요청: GET https://api.github.com/users/wilk

모듈:

'use strict';

app.service ('UserService', ['$resource', '$q', 'GITHUB_API_URL', function ($resource, $q, GITHUB_API_URL) {
  var userResource = $resource (GITHUB_API_URL + '/users/:user', {user: '@user'}) ,
      userModel = {};

  return {
    data: function () {
        return userModel;
    } ,
    populate: function (user) {
      var deferred = $q.defer () ,
          userRequest = userResource.get ({user: user});

      $q
          .when (userRequest.$promise)
          .then (function (data) {
              userModel = data;
              deferred.resolve (data);
          });

      return deferred.promise;
    }
  };
}]);

테스트:

'use strict';

describe ('Service: UserService', function () {
    beforeEach (module ('myApp'));

    var $appInjector = angular.injector (['myApp']) ,
        UserService = $appInjector.get ('UserService') ,
        GITHUB_API_URL = $appInjector.get ('GITHUB_API_URL') ,
        GITHUB_USER = $appInjector.get ('GITHUB_USER') ,
        $httpBackend;

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

        $httpBackend
            .when ('GET', GITHUB_API_URL + '/users/' + GITHUB_USER)
            .respond ({
                login: GITHUB_USER ,
                id: 618009
            });
    }));

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

    describe ('when populate method is called', function () {
        it ('should returns user data', function () {
            $httpBackend.expectGET (GITHUB_API_URL + '/users/' + GITHUB_USER);

            UserService.populate (GITHUB_USER);
            $httpBackend.flush ();
            expect(UserService.data ()).toEqual ({
                login: GITHUB_USER ,
                id: 618009
            });

        });
    });
});

GUITH_API_URL이 'https://api.github.com/' '과 같고 GUITH_USER가 'wilk'과 같다고 가정해 보겠습니다.

카르마-재스민 0.1.5AngularJS 1.2.6(Angular Mocks 및 시나리오 1.2.6 포함)으로 이 테스트를 실행하고 있습니다.

이 코드에 무슨 문제가 있습니까?

각각의 오류에 대해 따로 이야기해 보겠습니다.

오류: 플러시할 보류 중인 요청이 없습니다!

그 이유는 어떤 요청도 하지 않았기 때문입니다.$httpBackend, 그래서 물을 내릴 것이 없습니다.그건 당신이 순간화하고 있기 때문입니다.UserService전에$httpBackend그래서 Angular는 진짜 대신에 그것을 사용해야 한다는 것을 알지 못합니다.$http. 콘솔을 체크아웃하면 실제 요청이 전송되고 있음을 알 수 있습니다.

오류: 불만족스러운 요청: GET https://api.github.com/users/wilk

위와 같은 이유.부터$httpBackend서비스를 이용하는 것이 아니라, 당신이 만들어낸 기대는 결코 충족되지 않습니다.

다음은 위의 모든 사항을 고려한 후 귀사의 사양을 재분류한 것입니다.

describe ('Service: UserService', function () {
    var UserService,
        GITHUB_API_URL,
        GITHUB_USER,
        $httpBackend;

    beforeEach(function() {
      module('plunker');

      inject(function( _$httpBackend_, _UserService_, _GITHUB_API_URL_, _GITHUB_USER_) {
        $httpBackend = _$httpBackend_;
        UserService = _UserService_;
        GITHUB_API_URL = _GITHUB_API_URL_;
        GITHUB_USER = _GITHUB_USER_;
      });
    });

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

    describe ('when populate method is called', function () {
        it ('should returns user data', function () {
            $httpBackend
              .whenGET(GITHUB_API_URL + '/users/' + GITHUB_USER)
              .respond ({
                  login: GITHUB_USER,
                  id: 618009
              }); 

            UserService.populate(GITHUB_USER);
            $httpBackend.flush();

            expect(UserService.data().login).toBe(GITHUB_USER);
            expect(UserService.data().id).toBe(618009);
        });
    });
});

플렁커

참고: 주입 방식을 조금 바꿨지만, 지금 하고 있는 방식은 당신이 만드는 한 괜찮습니다.$httpBackend무엇보다도

언급URL : https://stackoverflow.com/questions/21577718/angularjsjasmine-httpbackend-not-working-as-expected