TypeError: синтаксический анализ не определен в тестовом модуле службы angularjs

Я пытаюсь выполнить модульный тест для службы, использующей $http. Я использую Jasmine, и я продолжаю получать эту ошибку:

TypeError: parsed is undefined в angular.js (строка 13737)

Вот как выглядит мой сервис:

angular.module('myapp.services', [])
.factory('inviteService', ['$rootScope', '$http', function($rootScope, $http) {
    var inviteService = {
        token: '',

        getInvite: function(callback, errorCallback) {
            $http.get('/invites/' + this.token + '/get-invite')

            .success(function(data) {
                callback(data);
            })

            .error(function(data, status, headers, config) {
                errorCallback(status);
            });
        }
    };

    return inviteService;
}]);

Вот как выглядит мой тест:

describe ('Invite Service', function () {
  var $httpBackend, inviteService, authRequestHandler;

  var token = '1123581321';

  beforeEach(module('myapp.services'));

  beforeEach(inject(function ($injector) {
    $httpBackend = $injector.get('$httpBackend');
    authRequestHandler = $httpBackend.when('/invites/' + token + '/get-invite').respond({userId: 'userX'}, {'A-Token': 'xxx'});
    inviteService = $injector.get('inviteService');
  }));

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

  describe ('getInvite', function () {
    beforeEach(function () {
      inviteService.token = token;
    });

    it ('should return the invite', function () {
      $httpBackend.expectGET('/invites/' + token + '/get-invite');
      inviteService.getInvite();
      $httpBackend.flush();
    });
  });
});

Я новичок в модульном тестировании приложений на основе angularjs, и я использовал пример в документации angularjs.

https://docs.angularjs.org/api/ngMock/service/$httpBackend

Я не уверен, что я мог упустить, и я уже пробовал разные вещи, и я всегда получаю одну и ту же ошибку, любая помощь будет оценена.


person Mauricio Gamboa    schedule 20.11.2014    source источник
comment
Я создал скрипт jsfiddle.net/themyth92/58aLjyp9/1, и он отлично работает . Возможно проблема не в самом тесте. Могу я спросить, какая у вас версия angularjs?   -  person themyth92    schedule 21.11.2014
comment
Эй, извините за задержку, у меня все еще есть проблема, но я вижу, что вы заработали на скрипке, я использую v1.2.11 angular. Спасибо!   -  person Mauricio Gamboa    schedule 24.11.2014
comment
Хм, я обновил скрипку вашей версией angulr, но все еще в порядке. Ссылка: jsfiddle.net/58aLjyp9/2. В этой строке следует заметить одну вещь: $httpBackend.expectGET('/invites/' + token + '/get-invite'); вы забыли ответить, как я на своей скрипке. За исключением того, что все в порядке, вы можете просмотреть свой код, где вы вызываете анализируемые переменные или, возможно, это связано с сервисом $parse в Angularjs.   -  person themyth92    schedule 25.11.2014


Ответы (1)


Переменная parsed — это URL-адрес рассматриваемой службы. Это undefined по одной из следующих причин:

  • URL-адрес имеет неверный формат
  • $http.get не вызывается
  • token не определено
  • sucess и error обратные вызовы не имеют data
  • .respond не вызывается
  • .respond не включает объект ответа в качестве аргумента

Например:

 describe('simple test', test);

 function test()
   {
   it('should call inviteService and pass mock data', foo);

   function foo() 
     {
     module('myapp.services');
     inject(myServiceTest);

     function myServiceTest(inviteService, $httpBackend)
       {
       $httpBackend.expect('GET', /.*/).respond(200, 'bar');

       function callback(){};

       inviteService.getInvite.token = '1123581321';
       inviteService.getInvite(callback, callback);

       $httpBackend.flush();

       expect(callback).toHaveBeenCalledOnce();
       }
     }
   }

Ссылки

person Paul Sweatte    schedule 24.07.2015