如何监视控制器的服务方法?

时间:2019-02-21 10:43:02

标签: angularjs unit-testing jasmine

我正在为控制器编写UT,并尝试实现commandRouter.execute方法(请参阅第二规范)时,我收到错误消息:无法读取未定义的属性'execute'。

有人可以让我知道我在这里做错了什么,以及从控制器窥探方法的正确方法是什么。 ?

module.controller('DcsPlus.AP.OmsControl.omsMasterRecipeDialogPopUpController', omsMasterRecipeDialogPopUpController);

    omsMasterRecipeDialogPopUpController.$inject = [
        'DcsPlus.Frame.Logic.commandRouter'
    ];

    function omsMasterRecipeDialogPopUpController(commandRouter) {
        var vm = this;

    vm.execute = function(command) {
        commandRouter.execute(command);
    };
} 

controller.spec.js

    describe('omsMasterRecipeDialogPopUpController', function () {

    var omsMasterRecipeDialogPopUpControllerTest;
    var commandRouterMock;
    var $scope;

    beforeEach(function () {
        registerMockServices();
        prepareCommandRouterMock();
    });


    describe('execute', function () {
        it('1. Should check if execute method is defined', function() {
            expect(omsMasterRecipeDialogPopUpControllerTest.execute).toBeDefined();
        });

        it('2. Should check if execute method of commandRouter is called', function() {
            omsMasterRecipeDialogPopUpControllerTest.execute();
            expect(commandRouterMock.execute).toHaveBeenCalled();
        });

    });

    function prepareCommandRouterMock() {
        commandRouterMock = {
            execute: function() {
            }
        };
    }

     /*beforeEach(function () {
         commandRouterMock = jasmine.createSpyObj('DcsPlus.Frame.Logic.commandRouter', ['execute']);
     });*/

    function registerMockServices() {
        angular.mock.module('DcsPlus.AP.OmsControl', function ($provide) {
            $provide.value('DcsPlus.Frame.Logic.commandRouter', commandRouterMock);
        });


        angular.mock.inject(['$controller', '$rootScope', 'dialogService',
            function ($controller, $rootScope, dialogService) {
            $scope = $rootScope.$new();
            spyOn(commandRouterMock, 'execute').and.callThrough();

            // Init the controller, passing our spy service instance
            omsMasterRecipeDialogPopUpControllerTest = $controller('DcsPlus.AP.OmsControl.omsMasterRecipeDialogPopUpController', {
                $scope: $scope
            });
        }]);
    }
});

1 个答案:

答案 0 :(得分:0)

在开始时,您创建commandRouterMock,但从不将其分配给任何内容。

尝试一下:

beforeEach(function () {
    registerMockServices();
    commandRouterMock = prepareCommandRouterMock();
});

function prepareCommandRouterMock() {
    return {
         execute: function() {
        }
    };
}