AngularJS 指令链接功能在 Jasmine 测试中不运行

Posted

技术标签:

【中文标题】AngularJS 指令链接功能在 Jasmine 测试中不运行【英文标题】:AngularJS directive link function does not run in Jasmine test 【发布时间】:2015-09-11 23:32:13 【问题描述】:

在我的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);
            ;

        

    

());

还有这个茉莉花规格;

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]

AngularJS directive link function not working AngularJS directive link function not executing replace element in angularjs directive linking function scope.$watch in directive link function not getting called AngularJS directive link function not being called anglarjs directive link function not called from compilefunction Link function not called AngularJS Link function not called AngularJS directive link function not called in jasmine test Angular directive link function not called during pagination Angular directive's link function not being called AngularJS Link function not called due to attribute name normalization AngularJS: Why is my directive's link function not being called?

【问题讨论】:

你确定它在应用程序中有效吗?我很确定控制器在链接功能之前首先被调用。因此,您在定义之前调用了 $scope.render。 这是一个简化的测试用例,但是在它工作的应用程序中是可以的——尽管应用程序涉及网络,但我可能有竞争条件。正在调查,谢谢。 【参考方案1】:

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

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

【讨论】:

以上是关于AngularJS 指令链接功能在 Jasmine 测试中不运行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jasmine 对包含私有超时的单元测试 Angularjs 指令

AngularJS - 将工厂注入指令的链接功能

jasmine matcher函数不在angularjs / karma单元测试中加载

在 AngularJS/Jasmine 中注入 Mock 服务

在Visual Studio 2013中使用Jasmine + Karma进行AngularJS测试

在 Jasmine 单元测试中模拟 AngularJS 模块依赖项