Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单元测试类似于ng if的角度指令_Javascript_Angularjs_Unit Testing_Karma Jasmine - Fatal编程技术网

Javascript 单元测试类似于ng if的角度指令

Javascript 单元测试类似于ng if的角度指令,javascript,angularjs,unit-testing,karma-jasmine,Javascript,Angularjs,Unit Testing,Karma Jasmine,我有一个打包在一起的服务和一个指令,如果不满足某些条件,可以删除DOM元素 该服务对传入的字符串执行检查,如果检查失败,该指令只会删除它附加到的DOM元素 这适用于IE11、Edge、Chrome和FireFox。然而,我似乎无法在任何测试中复制这一点 下面是一个服务及其提供者的示例 class PermissionService { constructor(permissions) { this.permissions = permissions; }

我有一个打包在一起的服务和一个指令,如果不满足某些条件,可以删除DOM元素

该服务对传入的字符串执行检查,如果检查失败,该指令只会删除它附加到的DOM元素

这适用于IE11、Edge、Chrome和FireFox。然而,我似乎无法在任何测试中复制这一点

下面是一个服务及其提供者的示例

class PermissionService {
    constructor(permissions) {
        this.permissions = permissions;
    }

    addPermissions(permissions) {
        this.permissions = this.permissions.concat(permissions);
    }

    has(permission) {
        return this.permissions.indexOf(permission) !== -1;
    }
}

class PermissionProvider {
    constructor() {
        let _permissions = [];

        this.setPermissions = (permissions) => {
            _permissions = _permissions.concat(permissions);
        };

        this.$get = () => {
            return new PermissionService(_permissions);
        }
    }
}
以及指令,并举例说明如何在角度模块中进行设置

angular.module('PermissionTest', [])
  .directive('hasPermission', ['permission', '$compile', (service, $compile) => {
    return {
      restrict: 'A',
      priority: 1,
      terminal: true,
      compile: (element, attrs) => {
        let permission = attrs.hasPermission;

        if (service.has(permission)) {
            attrs.$set('hasPermission', null);
            return (scope, element) => {
                $compile(element)(scope);
            }
        } else {
            element.remove();
        }
      }
    }
  }])
  .provider('permission', PermissionProvider)
  .config(['permissionProvider', (provider) => {
    provider.setPermissions(['yes']);
  }]);
使用该指令,我现在可以轻松地从DOM中删除元素

<!-- Is not removed -->
<div has-permission="yes">Is not removed</div>

<!-- Is removed -->
<div has-permission="no">Is removed</div>

和往常一样,在发布这个问题几分钟后,我找到了问题的解决方案。我认为我可以在一个独立于其余测试的描述中构建提供者,这是不正确的

通过在第一个描述中添加以下期望,我对此进行了调试:

describe('directive:has-permission', () => {
    // Provider set up in question

    it('should exist', inject(($injector) => {
        expect($injector.has('hasPermissionDirective')).toBe(true);
    }));
});
这件事成功地通过了

然后,我在下面的描述闭包中添加了同样的期望,令我惊讶的是,测试失败了

为了解决这个问题,我将所有后续描述嵌套在提供程序设置中,并按预期工作

describe('directive:has-permission', () => {

    // Provider setup

    describe('if directive is not valid', () => {
        // Test setup and code
    });
});
describe('directive:has-permission', () => {

    // Provider setup

    describe('if directive is not valid', () => {
        // Test setup and code
    });
});