Javascript 如何在angularjs jasmine单元测试中正确引用服务
以下是一个例子:Javascript 如何在angularjs jasmine单元测试中正确引用服务,javascript,angularjs,unit-testing,jasmine,karma-jasmine,Javascript,Angularjs,Unit Testing,Jasmine,Karma Jasmine,以下是一个例子: beforeEach(angular.mock.module('my-app')); beforeEach(angular.mock.inject(function (_$rootScope_, _$compile_, _sessionParams_, _$httpBackend_, _pclnABTesting_){...})); 在jasmine单元测试中,我们通常在Injectforangular.mock中看到这种\u服务 但我还是不知道这是怎么回事 例如,参数_m
beforeEach(angular.mock.module('my-app'));
beforeEach(angular.mock.inject(function (_$rootScope_, _$compile_, _sessionParams_, _$httpBackend_, _pclnABTesting_){...}));
在jasmine单元测试中,我们通常在Injectforangular.mock
中看到这种\u服务
但我还是不知道这是怎么回事
例如,参数_myService_u将解析为引用myService。由于它作为myService在函数体中可用,因此我们可以将其分配给在外部范围中定义的变量。
然而,在上面的例子中,它是否意味着,任何已经注入模块中的服务,我们都应该像\u MyServiceName\u
一样引用?这个MyServiceName
到底是从哪里来的?我们应该在注射前做些什么吗?这就是我感到困惑的地方。引入了添加下划线的约定,以简化单元测试的设置。通常,在测试中使用的名称没有下划线,例如:
var fooService, barService;
beforeEach(inject(function(_fooService_, _barService_) {
fooService = _fooService_;
barService = _barService_;
}));
it('should blah blah', function() {
fooService.foo();
// assert, assert, assert
});
如果每个参数之前的beforeach
没有下划线,那么在单元测试中就不能使用像fooService
这样的单一名称
var fooService, barService;
beforeEach(inject(function(fooService) {
// hmm how to setup outher variable fooService?
}));
但为了实用起见,有时您只需要一个服务在单元测试之前调用一些操作,例如
beforeEach(inject(function(bazService, _fooService_) {
bazService.clearSelection();
fooService = _fooService_;
}));
在这种情况下,添加下划线会有点过头,所以当你需要的时候,你可以添加下划线,当你不需要的时候,你可以离开。我就是这么看的
要使inject正常工作,必须在执行测试之前加载模块:
beforeEach(module('app'));
官方文档中有一个关于如何编写AngularJS测试的很好的教程:(如果您只想编写代码-滚动到测试控制器部分,测试服务也可以采用相同的方法)。所以下划线实际上是一种jasmine语法,可能适用于任何js应用程序测试。因此,这并不是角形结构的唯一特征。是吗?所以基本上,实际应用程序所具有的依赖性不能真正注入,但我们必须相应地模拟它们。正确的?我们真的不能注入实际的依赖项吗?@Chen不,不-这是角度注入语法,与Jasmine没有任何关系-我将编辑我的回答,但仍然有点困惑。因此,当app
在每个(模块('app'))之前被加载时
,这是否意味着它的所有依赖项、实际依赖项也可供参考?因此,如果我们做了\u fooService
,那么fooService
的实际服务是\u fooService
?在每个(模块('app'))之前的之后是,
该模块提供的所有服务都将可用于注入(在注入中使用)。如果应用程序模块依赖于其他非角度模块,则您也必须加载它们。确切地说,\u fooService\u
将表示来自app
模块的fooService