使用 Jasmine/Chutzpah 测试 Angular 服务时出错

Error testing Angular services with Jasmine/Chutzpah

我正在尝试使用 Jasmine 测试我的 AngularJs 服务,但我不断收到各种错误。 所以我尝试创建一个非常基本的 Sum 服务来测试它,但错误不断出现。

这是我要测试的 AngularJS 服务:

   angular.module('base', [])
   .service('operacoes', [function () {
      this.somar = function (n1,n2) {
          return n1 + n2;
      };
   }]);

我的测试:

/// <reference path="../../Scripts/angularjs/angular.min.js" />
/// <reference path="../../Scripts/angularjs/angular-mocks.js" />
/// <reference path="../../ServicoBase.js" />
describe("Testing Services", function () {
    var operacoesObj;

    beforeEach(angular.module('base'));

    beforeEach(inject(function (operacoes) {
        operacoesObj = operacoes;
    }));

    it('deve ter inicializado', function () {
        expect(operacoesObj).toBeDefined();
    });

    it('deve conseguir somar 2 números', function () {
        expect(operacoesObj.somar(5, 1)).to.equal(6);
    });
});

尝试 运行 这会测试 returns 我出现以下错误:

我尝试过其他 Jasmine 版本,例如 2.4.1(运行现在在 2.5.2 上)。

试试这个:

describe("Testing Services", function() {
  beforeEach(module('base'));

  it('deve ter inicializado', inject(function(operacoes) {
    expect(operacoes).toBeDefined();
  }));


  it('deve conseguir somar 2 números', inject(function(operacoes) {

    expect(operacoes.somar(5, 1)).toEqual(6);

  }))

});

测试服务与测试控制器不同。您应该使用 $injector.get() 到 return 一个服务实例。我将您的测试代码更改为以下内容并且测试通过了:

describe("Testing Services", function () {
    var svc;

    beforeEach(function() {
        angular.mock.module('base')

        inject(function($injector) {
            svc = $injector.get('operacoes');
        })
    });    

    it('deve ter inicializado', function () {
        expect(svc).toBeDefined();
    });

    it('deve conseguir somar 2 números', function () {
        expect(svc.somar(5, 1)).toEqual(6);
    });
});

请参阅 angular 单元测试服务文档 here

此外,通过测试来检查服务是否已定义并不是真正必要的。您将知道该服务是否未定义,因为如果未定义,您的所有其他单元测试都将失败。