Angular服务的简单单元测试

Oam*_*Psy 2 jasmine angularjs angularjs-scope angular-services karma-jasmine

我有一个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;
    }
});
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个非常基本的单元测试来检查服务是否已定义:

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();
            });
        });
    });     
});
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

PhantomJS 1.9.8 (Windows 7) app *Validating myNumberService service encountered a declaration exception FAILED
    TypeError: 'undefined' is not an object (evaluating 'service.calculateValue')
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏.

hon*_*n2a 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(...);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

如您所见,我实际上并没有在那里测试服务的存在.这是因为如果服务不存在,那么需要注入的测试将会失败并且出现一个非常容易理解的错误.您的单元测试应明确测试您的单元的功能; 将隐式测试代码的基本完整性.再举一个例子,你不会测试那calculateValue是一个函数.(尝试将其用作函数的第一个测试将失败,"...不是函数",如果不是.)


奖金提示:总和1 + 2 + 3 + ... + n可以简单计算为(n * (n + 1)) / 2.