使用 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 我出现以下错误:
- 类型错误:对象不支持 属性 或方法 'call'
- [$injector:unpr] http://errors.angularjs.org/1.4.4/$injector/unpr?p0=operacoesProvider%20%3C-%20operacoes
- 预期未定义被定义。
我尝试过其他 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。
此外,通过测试来检查服务是否已定义并不是真正必要的。您将知道该服务是否未定义,因为如果未定义,您的所有其他单元测试都将失败。
我正在尝试使用 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 我出现以下错误:
- 类型错误:对象不支持 属性 或方法 'call'
- [$injector:unpr] http://errors.angularjs.org/1.4.4/$injector/unpr?p0=operacoesProvider%20%3C-%20operacoes
- 预期未定义被定义。
我尝试过其他 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。
此外,通过测试来检查服务是否已定义并不是真正必要的。您将知道该服务是否未定义,因为如果未定义,您的所有其他单元测试都将失败。