最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - TypeError: parsed is undefined on angularjs service unit test - Stack Overflow

programmeradmin2浏览0评论

I am trying to make a unit test for a service that uses $http. I am using Jasmine and I keep on getting this error:

TypeError: parsed is undefined in angular.js (line 13737)

This is what my service looks like:

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;
}]);

This is what my test looks like:

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();
    });
  });
});

I am pretty new to unit testing angularjs based apps and I used the example in the angularjs documentation

/$httpBackend

I am not sure what I could be missing, and I already tried different things and I always get the same error, any help will be appreciated.

I am trying to make a unit test for a service that uses $http. I am using Jasmine and I keep on getting this error:

TypeError: parsed is undefined in angular.js (line 13737)

This is what my service looks like:

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;
}]);

This is what my test looks like:

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();
    });
  });
});

I am pretty new to unit testing angularjs based apps and I used the example in the angularjs documentation

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

I am not sure what I could be missing, and I already tried different things and I always get the same error, any help will be appreciated.

Share Improve this question asked Nov 20, 2014 at 19:57 Mauricio GamboaMauricio Gamboa 511 silver badge3 bronze badges 3
  • I have created a fiddle jsfiddle/themyth92/58aLjyp9/1 and it works perfectly fine. Maybe the problem is not on the test itself. Can I ask what is your angularjs version ? – themyth92 Commented Nov 21, 2014 at 3:06
  • Hey sorry for the delay, I'm still having the problem but I can see that you got it working on the fiddle, I am using v1.2.11 of angular. Thanks! – Mauricio Gamboa Commented Nov 24, 2014 at 16:14
  • Hmm, I have updated the fiddle with your angulr version but it still be ok. Link: jsfiddle/58aLjyp9/2. One thing to notice on this line "$httpBackend.expectGET('/invites/' + token + '/get-invite');" you forgot to call respond as I do on my fiddle. Except that everything is ok, you can take a look through your code where you call variables parsed or maybe it relates to $parse service in Angularjs – themyth92 Commented Nov 25, 2014 at 3:49
Add a ment  | 

1 Answer 1

Reset to default 7

The parsed variable is the URL from the service in question. It is undefined for one of the following reasons:

  • URL is malformed
  • $http.get is not called
  • token is not defined
  • sucess and error callbacks have no data
  • .respond is not called
  • .respond does not include a response object as an argument

For example:

 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();
       }
     }
   }

References

  • AngularJS source: angular-mocksSpec.js - "should throw exception when only parsed body differs from expected body object"

  • AngularJS source: urlUtils.js

  • AngularJS source: urlUtilsSpec.js

发布评论

评论列表(0)

  1. 暂无评论