如何在angularjs jasmine单元测试中正确引用服务

时间:2016-02-25 16:50:23

标签: javascript angularjs unit-testing jasmine karma-jasmine

以下是一个例子:

beforeEach(angular.mock.module('my-app'));

beforeEach(angular.mock.inject(function (_$rootScope_, _$compile_, _sessionParams_, _$httpBackend_, _pclnABTesting_){...}));

在茉莉花单元测试中,我们通常会在_service_的注入中看到这种angular.mock

但我仍然不确定这是如何运作的?

For example, the parameter _myService_ would be resolved as the reference myService. Since it is available in the function body as myService, we can then assign it to a variable defined in an outer scope.

在上面说的official doc中,它是否意味着,任何已经注入模块的服务,我们应该像_MyServiceName_一样引用?这MyServiceName到底是怎么来的?我们应该在注射前做些什么吗?那是我困惑的地方。

1 个答案:

答案 0 :(得分:0)

引入了添加下划线的惯例,以简化单元测试的设置。通常,您将在测试中使用没有下划线的名称,如:

var fooService, barService;

beforeEach(inject(function(_fooService_, _barService_) {
  fooService = _fooService_;
  barService = _barService_;
}));

it('should blah blah', function() {
  fooService.foo();
  // assert, assert, assert
});

如果beforeEach参数没有下划线,那么您将无法在单元测试中使用fooService这样的单个名称。

var fooService, barService;

beforeEach(inject(function(fooService) {
  // hmm how to setup outher variable fooService?
}));

但是要务实,有时你需要一个服务来在单元测试之前调用一些动作,例如

beforeEach(inject(function(bazService, _fooService_) {
  bazService.clearSelection();
  fooService = _fooService_;
}));

在这种情况下添加下划线会有些过分,所以当你需要它时你可以添加下划线,当你没有时,你就可以离开。多数民众赞成我的看法。

要使注入正常工作,必须在执行测试之前加载模块:

beforeEach(module('app'));

如何编写AngularJS测试的好教程在官方文档中:https://docs.angularjs.org/guide/unit-testing(如果你只需要代码 - 滚动到测试控制器部分,同样的方法用于测试服务)。