link AngularJS 指令的函数从未在 Jasmine 测试中调用

link function of AngularJS directive never called in Jasmine test

我不明白为什么我的指令的 link 函数从未在 Jasmine 测试中被调用。我做了一个简单的例子。

这是我的指令 (TestDirective.js):

'use strict';

angular.module('comp-one').directive('test',function(){

    return{
        restrict:'E',
        templateUrl:'components/comp-one/html/TestTemplate.html',
        scope:true,
        link:function(scope){
            scope.test='xxx';
        }
    };
});

这是测试用例:

'use strict';

describe('testDirective',function(){
    var $compile, $rootScope, element;

    beforeEach(module('comp-one'));
    beforeEach(module('templates'));

    beforeEach(inject(function(_$rootScope_,_$compile_){
        $compile = _$compile_;
        $rootScope = _$rootScope_;
    }));

    it('xxx', function(){
        var html = '<test></test>';
        element = $compile(html)($rootScope);
        $rootScope.$digest();

        expect( $rootScope.test ).toBe('xxx');
    });
});

测试失败,因为 link 函数从未被调用,所以 xxx 变量未定义。我预计 link 函数由“$compile(html)($rootScope);”执行陈述。 当我在浏览器中的 link 函数和 运行 应用程序(不是测试)中设置断点时,会调用 link 函数。

我正在 运行使用 Karma 进行测试,它也找到了我在控制台输出中看到的文件:

Processing "D:/JWS/test/workspace/bla/app/components/comp-one/scripts/TestDirective.js".

编辑:

好的, 当我将范围设置为 false 时,我发现测试 运行s 成功了。但是有没有办法用隔离范围测试 link 函数?

调用了link函数。您将在元素的范围内找到值,而不是在 $rootScope.

在预期部分使用 element.isolateScope().test 而不是 $rootScope.test