我有一个Angular服务,它接收一个数字N
(在1-12之间)并返回最多为12 - N
的整数之和:
app.value('myNumberService', {
calculateValue: function (n) {
var empty = [];
for(var i = 0; i < 12 - n; i++){
empty.push(i);
}
return empty;
}
});
我正在尝试编写一个非常基本的单元测试来检查服务是否已定义:
describe('app', function () {
var app, service;
beforeEach(function () {
app = angular.mock.module('app')
});
beforeEach(inject(function($injector) {
service = $injector.get('myNumberService');
}));
describe('*Validating myNumberService service', function () {
describe("calculateValue", function(){
it("should be defined.", function(){
expect(service.calculateValue()).toBeDefined();
});
});
});
});
我收到此错误:
PhantomJS 1.9.8 (Windows 7) app *Validating myNumberService service encountered a declaration exception FAILED
TypeError: 'undefined' is not an object (evaluating 'service.calculateValue')
任何帮助表示感谢。
答案 0 :(得分:8)
我不确定为什么你的测试第一眼就失败了。但是,它有很多可以改进的东西(中间的某个地方可能是错误的)。以下是我为该模块编写单元测试的方法:
describe('app', function () {
var myNumberService;
beforeEach(module(this.description)); // this.description === 'app'
beforeEach(inject(function (_myNumberService_) {
myNumberService = _myNumberService_; // see documentation for `angular.mock.inject`
}));
describe('myNumberService', function () {
it('calculates ...', function () {
expect(myNumberService.calculateValue(...)).toBe(...);
});
});
});
正如您所看到的,我实际上并没有在那里测试服务的存在。这是因为如果服务不存在,那么需要注入的测试将会失败并且出现一个非常容易理解的错误。您的单元测试应明确测试您的单元的功能;将隐式测试代码的基本完整性。再举一个例子,你不会测试calculateValue
是一个函数。 (尝试将其用作函数的第一个测试将失败,&#34; ...无论如何都不是函数&#34; ,如果它不是。)
额外提示:1 + 2 + 3 + ... + n
的总和可以simply计算为(n * (n + 1)) / 2
。