Angularjs Jasmine spy未跟踪页面加载时执行的JS函数

Angularjs Jasmine spy未跟踪页面加载时执行的JS函数,angularjs,jasmine,karma-jasmine,Angularjs,Jasmine,Karma Jasmine,这是我的测试\u sp.js: describe('Controller: MainCtrl', function() { var ctrl, mockBaseService; beforeEach(function() { mockBaseService = { sps: 'x', cerrorMessages: 'y', add: { sp: function(something, c

这是我的
测试\u sp.js

describe('Controller: MainCtrl', function() {
    var ctrl, mockBaseService;

    beforeEach(function() {

        mockBaseService = {
            sps: 'x',
            cerrorMessages: 'y',
            add: { sp: function(something, cb) { cb() } },
            fetch: { selfsps: function(cb) { cb() } },
            logout: function() {},
        };


        module('BaseApp', function($provide) {
            $provide.value('BaseService', mockBaseService);
        });

        module('SpPageApp');


        inject(function($controller) {
            ctrl = $controller('MainCtrl', {
            });
        });

        spyOn(mockBaseService.fetch, 'selfsps');

    });

     it('should fetch sps from BaseService.fetch.selfsps right away.', function() {
         expect(mockBaseService.fetch.selfsps).toHaveBeenCalled();
     });

});
angular.module("SpPageApp", ["BaseApp"])
    .controller("MainCtrl", ["$http", "$window", "BaseService", function($http, $window, BaseService) {

        var self = this;

        // Call BaseService.fetch.selfsps at the beginning of the file.
        BaseService.fetch.selfsps(function() {
            self.sps = BaseService.sps;
            self.cerrorMessages = BaseService.cerrorMessages;
        });

        self.add = function() {
            BaseService.add.sp(self.sp, function() {
                self.cerrorMessages = BaseService.cerrorMessages;
            });
        };    
    }]);
这是我的
sp.js

describe('Controller: MainCtrl', function() {
    var ctrl, mockBaseService;

    beforeEach(function() {

        mockBaseService = {
            sps: 'x',
            cerrorMessages: 'y',
            add: { sp: function(something, cb) { cb() } },
            fetch: { selfsps: function(cb) { cb() } },
            logout: function() {},
        };


        module('BaseApp', function($provide) {
            $provide.value('BaseService', mockBaseService);
        });

        module('SpPageApp');


        inject(function($controller) {
            ctrl = $controller('MainCtrl', {
            });
        });

        spyOn(mockBaseService.fetch, 'selfsps');

    });

     it('should fetch sps from BaseService.fetch.selfsps right away.', function() {
         expect(mockBaseService.fetch.selfsps).toHaveBeenCalled();
     });

});
angular.module("SpPageApp", ["BaseApp"])
    .controller("MainCtrl", ["$http", "$window", "BaseService", function($http, $window, BaseService) {

        var self = this;

        // Call BaseService.fetch.selfsps at the beginning of the file.
        BaseService.fetch.selfsps(function() {
            self.sps = BaseService.sps;
            self.cerrorMessages = BaseService.cerrorMessages;
        });

        self.add = function() {
            BaseService.add.sp(self.sp, function() {
                self.cerrorMessages = BaseService.cerrorMessages;
            });
        };    
    }]);
BaseService
位于
base.js
中的
BaseApp
模块中

话虽如此,当我通过执行
karma start
测试代码时,我得到以下错误:

    Expected spy selfsps to have been called.
        at Object.<anonymous> (/home/a/Documents/CMS/CMSApp/static/js/karma/tests/test_sp.js:59:56)
Chromium 47.0.2526 (Ubuntu 0.0.0): Executed 5 of 5 (1 FAILED) (0 secs / 0.105 secChromium 47.0.2526 (Ubuntu 0.0.0): Executed 5 of 5 (1 FAILED) (0.15 secs / 0.105 secs)

为什么不调用
mockBaseService.fetch.selfsps
,即使在我的
sp.js
中,我是在文件的开头调用它?

首先实例化控制器。调用
BaseService.fetch.selfsps()函数。然后,你开始监视这个函数。太晚了

您需要在实例化控制器之前进行监视。就像,如果你想监视电话对话,你需要在对话开始前开始倾听。如果你在谈话结束后开始听,你什么也听不到