如何在AngularJS中对$location service search()方法进行单元测试?

如何在AngularJS中对$location service search()方法进行单元测试?,angularjs,unit-testing,jasmine,karma-runner,Angularjs,Unit Testing,Jasmine,Karma Runner,如何创建AngularJS$location service search()方法的单元测试 我使用Jasmine+Karma进行测试和AngularJS 1.3,单元测试对我来说是新的:) 这是我的服务,在生产中运行良好,顺便说一句: 'use strict'; (function () { angular.module('myApp') .service('myService', function ($location) { var _customerId = $locat

如何创建AngularJS$location service search()方法的单元测试

我使用Jasmine+Karma进行测试和AngularJS 1.3,单元测试对我来说是新的:)

这是我的服务,在生产中运行良好,顺便说一句:

'use strict';
(function () {
angular.module('myApp')
   .service('myService', function ($location) {
      var _customerId = $location.search().id;
      /*jshint validthis:true */
      this.customerId = _customerId;
   });
})()
这是我的服务规范:

describe('Service: mySerivce', function(){

 var $location;

 beforeEach(module('myApp'));

 beforeEach(inject(function(_$location_){
  $location = _$location_;
 }));

 it('should get ID from url', function(){
   $location.path('/?id=1080');

   console.log($location.path()); // logs: '/?id=1080'
   console.log($location.search().id); // logs: undefined

   expect($location.search().id).toEqual(1080); // Returns err msg Expected undefined to equal 1080.
  })

});

当我使用search()方法时,我得到的都是未定义的?如何在单元测试中使用该方法?

根据注释,您需要一个
$location.search().id
来检查控制器功能,在这种情况下,最好的选择是在注入服务(任何真正的服务)上使用
spyOn


请记住,一些服务/指令需要触发
$scope.digest()
,并更改值是的,然后我仍然没有定义。我如何测试customerId呢?首先,您正在进行的测试没有多大意义,您只需测试$location.path本身,它已经由AngularJS;测试过了。)要使$location.search()反映更改,您可能需要运行$scope.$digest()或使用spyOn测试值将查看spyOn:)我测试搜索方法的原因是我想将其用于另一个测试。测试使用$httpBackend,我需要GET请求中的ID。要测试使用搜索的控制器,可以执行以下操作:
spyOn($location,'search')。andReturn({ID:'mockedd'})
在这里可以检查对后端的调用是否包含此mockeddthx!这就成功了:)这只是给其他可能阅读本文的人的一个提示,如果您使用的是Jasmine版本2.0+,那么它是.and.returnValue(),而不是.andReturn()spyOn($location,'search')。和CallFake(function(){});//也很方便!
spyOn($location, 'search').andReturn({ id: mockedid })