angularjs - 测试删除 dom 元素的 Angular 指令不起作用(至少对我来说......)

标签 angularjs angularjs-directive

我有一个指令,可以在进行某些权限检查时删除 dom 元素:

angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
    return {
        restrict: 'A',
        link: function (scope, element, attributes) {

            var permissionNeeded = attributes.permissionNeeded;

            if (permissionNeeded) {
                if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
                    element.remove();
                }
            }
        }
    };
});

指令工作正常,但我无法测试它。 DOM 操作 (element.remove()) 似乎是在我的期望断言之后触发的:

 it('should not do anything cos permissions are correct', function () {
        $route.current = {
            name: 'import'
        }
        var element = compileTemplate('<span permission-needed="W">Some content goes here</span>');
        $rootScope.$digest();
        expect(element.html()).toBe(''); // FAIL!!! it's still equals to 'Some Content goes here'
    });

我已经看到一些关于使用 $timeout 函数来延迟期望断言的答案,但无论我尝试什么,断言都会失败(element.html() 仍然等于“有些内容放在这里”)

但是,有趣的是(是吗?),如果我只是更改 dom 而不是在指令中删除它,我的测试就可以了:

angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
    return {
        restrict: 'A',
        link: function (scope, element, attributes) {

            var permissionNeeded = attributes.permissionNeeded;

            if (permissionNeeded) {
                if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
                    element.html('');
                }
            }
        }
    };
});

使用上面的指令,测试通过。

当我做出断言时,我猜测 dom 渲染尚未结束,我是否正确?如果是这样,我该怎么做才能在 DOM 渲染后延迟断言?

谢谢。

马蒂厄。

最佳答案

当您执行 element.remove() 时,它只会从其父元素 remove bound events, etc 中删除该元素。 .

最短的解决方案是将指令包含在父元素中:

var element = compileTemplate('<div><span permission-needed="W">Some content goes here</span></div>');

然后

expect(element.html()).toBe('')

将通过,因为element不再包含span

关于angularjs - 测试删除 dom 元素的 Angular 指令不起作用(至少对我来说......),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033484/

相关文章:

javascript - 有没有办法用 AngularJS 创建自定义动画事件

AngularJS $resource 自定义 header

javascript - AngularJS : directive inside ng-repeat not respecting new order

javascript - 使用函数初始化 ng-model 字符串

javascript - Angular js : call parent controller method from directive

angularjs - Angular js 从默认值初始化 ng-model

javascript - 如何使用 AngularJS 和 CreateJS 预加载图像

javascript - 创建持续时间输入(mm :ss:ms) in an AngularJS directive

javascript - 具有双向绑定(bind)的隔离范围指令不反射(reflect) Controller 范围的变化

javascript - 占位符评估后的 AngularJS 事件