测试是否在Service

时间:2018-05-13 21:07:06

标签: angularjs unit-testing jasmine

如何测试$ service中的AngularJS私有方法是否被调用?我将不胜感激任何帮助。

angular.module('login')
.service('EventService', [ '$http', '$log', function ($http, $log) {

    function sendEvent(category, action, label, value, customParams) {
        //
    }

    return {
        sendLoginPageEvent: function (action, customParams) {
            if (!customParams) {
                customParams = {};
            }
            customParams.template = 'templateName';

            sendEvent('LoginPage', action, null, null, customParams);
        },

    };

}]);

我有一些像这样的测试,但似乎不起作用:

describe('Test of Cookie Monster service', function() {

    var EventService;
    var sendEventSpy = jasmine.createSpy('eventSpy');


    beforeEach(module(function($provide) {
        $provide.value("event", sendEventSpy);
    }));

    beforeEach(inject(function (_EventService_) {
        EventService = _EventService_;
    }));


    it('send cookie event', function() {
        EventService.sendLoginPageEvent('action')

        expect(event.sendEvent)
        .toHaveBeenCalledWith('LoginPage', 'action', {template: 'templateName'})
    });
});

这是否是以这种方式测试服务的正确方法?我刚刚开始测试前端,所以我会感激任何建议。

1 个答案:

答案 0 :(得分:1)

这不是私有方法,这是本地函数。变量在定义它们的范围之外不可用,这可用于在JS中实现Module模式。

为了可测试,应将其定义为服务方法:

this.sendEvent = ...

然后它可以像任何其他方法一样被发现:

spyOn(EventService, 'sendEvent').and.callThrough()