2014-11-20 112 views
5

我想为使用$ http的服务进行单元测试。我使用的茉莉花,我不断收到此错误:TypeError:解析未定义在angularjs服务单元测试

TypeError: parsed is undefined in angular.js (line 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

我不确定我可能会错过什么,而且我已经尝试过不同的事情,并且我总是得到相同的错误,任何帮助将不胜感激。

+0

我创建了一个小提琴http://jsfiddle.net/themyth92/58aLjyp9/1/和它完美的罚款。也许问题不在于测试本身。我可以问你的angularjs版本是什么? – themyth92 2014-11-21 03:06:06

+0

嘿,对不起,延迟,我仍然有问题,但我可以看到你得到它在小提琴上工作,我使用的是角的v1.2.11。谢谢! – 2014-11-24 16:14:45

+0

嗯,我用你的angulr版本更新了小提琴,但它仍然没问题。链接:http://jsfiddle.net/58aLjyp9/2/。有一点需要注意:“$ httpBackend.expectGET('/ invites /'+ token +'/ get-invite');”你忘了打电话给我,因为我在我的小提琴上。除了一切正常之外,您可以通过代码调用分析的变量或者可能涉及到Angularjs中的$ parse服务 – themyth92 2014-11-25 03:49:56

回答

6

parsed变量是相关服务的URL。这是undefined由于以下原因之一:

  • URL是错误的
  • $ http.get不叫
  • token没有定义
  • sucesserror回调没有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(); 
     } 
    } 
    } 

参考