可以测试依赖于其他模块以及其中的提供者和服务的模块。假设我们需要测试依赖于模块'B'的模块'A':
完全不是coffeescript,而是为了简洁而伪代码:)
beforeEach ->
angular.module('B',[])
module ($provide)->
$provide.provider 'foo', ->
this.$get = -> # ...etc...etc.
it 'testing module A', ->
module('A')
inject -> # ...etc...etc.
现在,想象一下,我们有很多需要模拟的模块,以及许多服务和提供商。那么如何将'B'部分伪装成一个单独的文件? 以及如何使用它们?使用模块加载器(webpack,browserify)是完全可能的,但如何没有?使用角度功能和Karma提供的开箱即用功能?
是否可以将整个模拟器包装到角度模块中并将其加载到beforeEach
?
答案 0 :(得分:1)
是的,实际上,使用Karma可以轻松地在Angular中测试服务自己的模块。
只要你的测试框架设置正确 - Angular mocks,所有必需的模块都加载到Karma(检查Karma配置) - 然后这是相当简单的。
以下示例假定FirstService
是您正在测试的服务,SecondService
是FirstService依赖并与之交互的另一项服务。
describe('FirstService', function () {
var SecondService;
beforeEach(module('FirstService'));
beforeEach(inject(function (_SecondService_) {
SecondService = _SecondService_;
spyOn(SecondService, 'doSomethingElse');
}));
it('calls SecondService.doSomethingElse', function () {
FirstService.doSomething();
expect(SecondService.doSomethingElse).toHaveBeenCalled();
});
});
您将模块包含在第一行指定的beforeEach
中 - 在包含它时不要使用方括号[]
,因为它重新定义了模块并且您希望按原样包含现有模块
虽然您在导入模块时应省略方括号,但您应该确保在最初创建FirstService模块时(例如,在app.js
文件中,如果这是您的项目设置方式)你真的把SecondService作为一个依赖包括在内:
angular.module('FirstService', ['SecondService'])
第二个beforeEach
正在注入SecondService模块。它已经全局可用于注入,并且可以通过其模块名称访问,其带有前导和尾随下划线,即_SecondService_
。我已将其分配给变量,以便可以在it
语句中使用它,否则我需要在每个it
语句中注入它而不是beforeEach
我正在使用Jasmine' spyOn
创建一个间谍来监视方法doSomethingElse
,以确保它已被调用。 spyOn
的第二个参数(方法名称)应该有引号,但第一个不应该是 - 它应该是您刚为SecondService定义的变量。
示例单元测试测试调用FirstService.doSomething()
调用SecondService.doSomethingElse()
。