以下是一个例子:
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
到底是怎么来的?我们应该在注射前做些什么吗?那是我困惑的地方。
答案 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(如果你只需要代码 - 滚动到测试控制器部分,同样的方法用于测试服务)。