Unit testing 指令内的单元测试角度指令

Unit testing 指令内的单元测试角度指令,unit-testing,angularjs,karma-runner,Unit Testing,Angularjs,Karma Runner,我很难在angularjs指令上运行karma单元测试。以下是我的设置: var scope, ele; var template = '<div data-my-directive data="data" config="config"></div>'; beforeEach(function () { // Load directive's module module('dashboard'); mod

我很难在angularjs指令上运行karma单元测试。以下是我的设置:

var scope, ele;
    var template = '<div data-my-directive data="data" config="config"></div>';

    beforeEach(function () {
        // Load directive's module
        module('dashboard');
        module('templates-dev');

        // Load mock services/data (overriding real implementation)
        module(function($provide) {
            $provide.value("MockWidgetData", new MockWidgetData());
        });

        // Construct services/data to be available
        // inside each testing block.
        inject(function($rootScope, $compile, MockWidgetData) {
            // Create a fresh scope
            scope = $rootScope.$new();
            ele = angular.element(template);

            // Fill that scope with mock data
            scope.config = MockWidgetData.config;
            scope.data = MockWidgetData.data;

            // Compile the element and attach our scope
            $compile(ele)(scope);

            // Digest the scope to trigger a scope update
            // and attach our directive's link function
            scope.$digest();
        });
    });
以下是我的指令示例:

angular.module('dashboard').directive('myDirective', function() {
    return {
        restrict: 'A',
        templateUrl: 'my-dir-template.html',
        scope: { // 
            data: '=',
            config: '='
        },
        replace: true,
        link: function(scope, element, attrs) {

            scope.someFunc() = { ... },
            scope.someFunc1() = { ... },

        });
问题:

  • 在$compile(ele)(scope)之后,元素的.log()将显示整个 DOM,包括各种angular.js指令和其他奇怪的 信息。我希望看到我的指令的测试模板 与上面的templateUrl混合在一起。
  • 作用域的.log()显示完整的数据和配置对象及其预期值。它还显示了我的指令的link函数中可用的函数,正如人们所期望的那样。然而,在我的测试块中,似乎范围对象是空的。。。我无法访问指令的任何函数(它们都返回未定义的)。
  • 我可以通过
    ele.find(“#my btn”).eq(0)
    捕获指令html中的一些元素,但没有正常的函数可以工作(.click(),等等)。
我做错了什么?编译过程有什么问题吗?我的考试安排错了吗?我是否应该尝试删除链接功能并用控制器替换它?我的望远镜没有对准,这两天来我一直在失败。。。有点烦人



经过仔细检查。。。看起来我可以在
$compile(ele)(scope)
之前
scope.$digest()
,这将正确地将“data”和“config”对象传播到子作用域。但是,我的作用域将失去对指令链接中定义的函数的访问权限

您应该在
$compile(ele)(scope)
之后调用
scope.$digest()
。摘要是进行指令编译所必需的。您的指令有一个独立的作用域,这就是为什么您不能访问它的函数。要获得它们,您应该尝试以下方法:

var-elScope=element.isolateScope()
这是你的
elScope.someFunc()

检查以下单元测试指令示例:


您能否提供一些Plunker脚本,说明您所描述的问题?
angular.module('dashboard').directive('myDirective', function() {
    return {
        restrict: 'A',
        templateUrl: 'my-dir-template.html',
        scope: { // 
            data: '=',
            config: '='
        },
        replace: true,
        link: function(scope, element, attrs) {

            scope.someFunc() = { ... },
            scope.someFunc1() = { ... },

        });