AngularJS指令链接函数不在Jasmine测试中运行

时间:2015-06-25 11:24:19

标签: javascript angularjs-directive jasmine

在我JSFiddle我有这个指令。

(function() {

    angular.module('myApp', [])
        .directive('appFoo', appFoo);

    function appFoo() {

        console.log('Directive Factory runs');

        return {
            controller: AppFooController,
            link: link,
            replace: true,
            restrict: 'E',
            scope: {
                parentProp: '='
            }
        };

        function AppFooController($scope) {

            console.log('Controller runs');

            $scope.render({
                some: 'data'
            });

        }

        function link($scope, $element) {

            console.log('Link function runs');

            $scope.render = function(data) {
                console.log(shared.$scope.parentProp, $element[0], data);
            };

        }

    }

}());

这个Jasmine Spec;

describe('myApp::appFoo', function() {

    var shared;

    beforeEach(function() {

        shared = {};
        shared.markup = '<app-foo parent-prop="someProp"></app-foo>';

        inject(function($compile, $rootScope) {
            shared.$compile = $compile;
            shared.$parentScope = $rootScope.$new(true);
            shared.$rootScope = $rootScope;
        });

        shared.createDirective = function() {
            shared.$element = angular.element(shared.markup);
            shared.$compile(shared.$element)(shared.$parentScope);
            shared.$parentScope.$digest();
            shared.el = shared.$element[0];
            shared.$childScope = shared.$element.scope();
        };

    });

    describe('when compiled', function() {

        describe('when all parameters are provided', function() {

            beforeEach(function() {
                shared.$parentScope.someProp = {
                    a: 'a',
                    b: 'b'
                };
                shared.createDirective();
            });

            it('should have a render method', function() {
                expect(typeof shared.$childScope.render).toEqual('function');
            });

        });

    });

});

链接功能的工作是向范围添加渲染方法。它适用于应用程序,但在Jasmine测试中它永远不会运行。

我已经查看了下面列出的各种其他问题,但没有运气。

任何帮助表示感谢。

[1]

1 个答案:

答案 0 :(得分:0)

正如@ aliasm2k所指出的,这里的问题是在链接函数之前调用控制器。

因为控制器在链接函数创建它之前调用$ scope.render,所以放弃了调用堆栈并且没有运行链接函数。