javascript - 使用 .$on 测试指令

标签 javascript angularjs angularjs-directive jasmine karma-jasmine

我已经使用 .$on 编写了几个 Controller 并且能够成功地测试它们,请参阅 plunker:http://plnkr.co/edit/8cwcdPc26PVAURmVFR8t?p=preview

但是,我现在有一个在其链接函数中使用 .$on 的指令:

app.directive('myDirective', function($rootScope, $timeout) {
    return {
        restrict: 'A',
        replace: true,
        scope: {},
        link: function(scope,element,attrs){

            scope.$on("step1", function(event) {
                $rootScope.$broadcast('step3');
                scope.hidden = false;
                scope.shown = false;
            });
            scope.$on("step2", function(event) {
                scope.msg = '';
                scope.errorCase = false;
                scope.infoCase = false;
            });
            scope.$on("step3", function(event) {
                scope.hidden = true;
            });
        },
        template: 
                        '<div class="wrapper">' +
                            '<p>{{ msg }}</p>' +
                        '</div>'
    };
});

我写了下面的测试:

describe('myDirective', function () {
    var $scope, compile, element;

    beforeEach(module('myApp'));

    beforeEach(inject(function ($rootScope, $compile) {
        $scope = $rootScope.$new();
        element = angular.element("<section my-directive></section>");
        $compile(element)($scope);
        $scope.$digest();
    }));

    it('should initialise step1', function (){
        var sub_scope = $scope.$new();
        sub_scope.$emit('step1');
        expect($scope.hidden).toBeFalsy();
        expect($scope.shown).toBeFalsy();
    });
});

但是测试根本没有运行,所以没有显示错误。我采用了与 Controller 相同的方法,但是我认为这对于指令来说是不正确的。有什么建议吗?

最佳答案

您正在根据您的定义为您的指令创建一个新范围:

app.directive('myDirective', function($rootScope, $timeout) {
    return {
// ... Your code ...
        scope: {}, // This is a new isolated scope for the directive
// ... Your code ...
    };
});

在您现有的测试中,您的 $scope 变量是创建指令的父级的范围。您需要通过调用 'isolateScope' 来获取测试中指令的范围。 .见 fork plunker

it('should initialise step1', function (){
    var directiveScope = element.isolateScope();
    var sub_scope = directiveScope.$new();
    sub_scope.$emit('step1');
    expect(directiveScope.hidden).toBeFalsy();
    expect(directiveScope.shown).toBeFalsy();
});

关于javascript - 使用 .$on 测试指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32817834/

相关文章:

node.js - Sequelize PostgresQL - 列不存在时

php - 如何使用Angularjs在mysql中获取特定id的数据

javascript - 输入更改时不调用指令

javascript - 从子指令调用指令函数不起作用

javascript - jQuery JSON 数据库变量在 Javascript 中的应用

javascript - 使用相同图像映射的多个图像 - 如何在点击时返回正确的图像引用?

php - AngularJS 和 PHP 在数据库中输入空白行

javascript - Angular Directive(指令) : whats the difference between scope in controller vs scope in link function?

javascript - 你如何对 JavaScript 代码进行性能测试?

javascript - gulp 构建时的 BrowserslistError(name)