如何在AngularJS应用程序中模拟/ stub activate()方法

时间:2016-07-06 14:01:39

标签: angularjs unit-testing jasmine tdd

我目前正在开发一个大型的AngularJS应用程序,非常基于优秀的AngularJS Styleguide by John Papa

他的一个建议是使用activate()方法作为每个控制器的一种引导程序。这使您的代码结构清晰,您可以立即知道引导开始的位置。很多时候,我用它来加载数据(我更喜欢这一点而不是路由解析)。

我遇到的问题是如何在不运行methodUnderTest()方法的情况下对下面的代码示例中的activate() - 方法进行单元测试。

(function() {
    'use strict';

    angular
        .module('myApp', [])
        .controller('ControllerUnderTest', ControllerUnderTest);

    ControllerUnderTest.$inject = [];

    /* @ngInject */
    function ControllerUnderTest() {
        var vm = this;

        // attach functions to vm
        vm.activate = activate;
        vm.methodUnderTest = methodUnderTest;

        // activate
        activate();

        function activate() {
            // controller start-up logic
        }

        function methodUnderTest() {
            // how to test this method, without running the activate() method
        }
})();

下面是我目前拥有的测试代码,但正如您所期望的那样,它始终会运行activate()方法(这不是我想要的)。

(function() {

    var scope, createController;

    beforeEach(module('myApp'));

    describe('ControllerUnderTest', function(){
        beforeEach(inject(function($rootScope, $controller) {
            scope = $rootScope.$new();

            createController = function() {
                return $controller('ControllerUnderTest', { 'scope': scope });
            };
        }));

        it('should be defined', function() {
            var controller = createController();
            expect(controller).toBeDefined();
        });

        it('should have a methodUnderTest', function() {
            var controller = createController();
            expect(controller.methodUnderTest).toBeDefined();
        });

    });
})();

如何在不运行ControllerUnderTest.methodUnderTest()方法的情况下测试activate()

1 个答案:

答案 0 :(得分:1)

在模块单元测试中,您必须模拟所有超出测试范围的依赖项。

喜欢:

beforeEach(module(function ($provide) {
    $provide.service("myService", function () {
        this.myMethod = function () {
            return "myValue";
        };
    });
}));