Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在angularjs jasmine单元测试中正确引用服务_Javascript_Angularjs_Unit Testing_Jasmine_Karma Jasmine - Fatal编程技术网

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单元测试中,我们通常在Injectfor
angular.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