【发布时间】:2015-09-15 09:06:25
【问题描述】:
我是单元测试的新手,主要从我找到的示例中学习。问题是我见过太多不同的模式,很难理解它们之间的区别。以及如何为各种用例组合这些模式。下面是一种这样的模式:
var $rootScope, $window, $location;
beforeEach(angular.mock.module('security.service', 'security/loginModal.tpl.html'));
beforeEach(inject(function(_$rootScope_, _$location_) {
$rootScope = _$rootScope_;
$location = _$location_;
}));
var service, queue;
beforeEach(inject(function($injector) {
service = $injector.get('security');
queue = $injector.get('securityRetryQueue');
}));
因此,从这个模式中,我发现 Angular 核心服务/提供者应该使用下划线模式注入,而其他 3rd 方依赖项或我自己的依赖项应该使用 $injector.get() 模式完成。这是有效的吗?我注意到我可以使用 Angular 核心服务执行 $injector.get() 并且它仍然可以工作,所以也许这样做只是惯例?另外,beforeEach(angular.mock.module('security.service', 'security/loginModal.tpl.html')); 中的“security/loginModal.tpl.html”有什么意义?我知道这是一个添加到模板缓存中的 HTML 模板,但是 angular.mock.module 用它做什么?
我还看到了这种不太常见的模式,它在上述逻辑中引发了活动:
beforeEach(inject(function($injector, _$location_) {
security = $injector.get('security');
$location = _$location_;
}));
如果我可以像这段代码对 $location 所做的那样向注入回调添加服务,那似乎是一种更简单的引用依赖项的方法。为什么我不应该这样做?
这是另一种模式:
beforeEach(function() {
module('security.service', function($provide) {
$provide.value('$window', $window = jasmine.createSpyObj('$window', ['addEventListener', 'postMessage', 'open']));
});
inject(function(security) {
service = security;
});
});
据我了解,此模式的重点是使用模拟的 $window 初始化“security.service”模块。这是有道理的,但是我如何使这种模式与以前的模式相适应?即如何模拟“security/loginModal.tpl.html”,如何注入我的 Angular 核心依赖项 + 我的其他依赖项?
最后,我可以和不能在嵌套描述中注入什么并且它会阻塞?假设我不能将模拟服务重新注入到我正在测试的模块中是否安全。那么我可以注入什么以及用例是什么?
如果有帮助回答这些问题的 AngularJS 单元测试初始化的权威文档来源,请指出它。
【问题讨论】:
标签: angularjs unit-testing jasmine karma-jasmine