在角度应用程序中组织单元测试

时间:2015-06-12 23:07:25

标签: angularjs unit-testing karma-runner

可以测试依赖于其他模块以及其中的提供者和服务的模块。假设我们需要测试依赖于模块'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

1 个答案:

答案 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()