当前位置: 首页 > 面试题库 >

测试元素指令-测试期间无法访问隔离的范围方法

咸晨
2023-03-14
问题内容

我有以下指令。

directivesModule.directive('wikis', function() {
var urlRegex = new RegExp('^(https?)://.+$');

return {
    restrict: 'E', 
    templateUrl: 'templates/wiki-list.html',
    scope: {
        wikis: '='
    },
    link: function(scope, element, attrs) {
        scope.newWikiURL = '';

        scope.$watch('wikis', function() {
            if (scope.wikis == undefined || scope.wikis.length === 0) {
                scope.class = 'hide';
            } else {
                scope.class = 'show';
            }
        }, false);

        scope.addWiki = function() {
            if (scope.wikis == undefined) {
                scope.wikis = [];
            }

            var nw = scope.newWikiURL;
            if (nw != undefined && nw.trim() != '' && urlRegex.exec(nw)) { 
                scope.wikis.push(nw);
                scope.newWikiURL = '';
            }
        }

    }
};

});

当我测试它时:

describe('Wikis Directive Test Suite', function() {
    var scope, elem, directive, linkFn, html;

    beforeEach(function() {
        html = '<wikis wikis=''></wikis>';

        inject(function($compile, $rootScope) {
            scope = $rootScope.$new();
            scope.wikis = [];

            elem = angular.element(html);

            $compile(elem)(scope);

            scope.$digest();
        });

    });

    it('add Wiki should add a valid wiki URL to artist', function() {
        var url = 'http://www.foo.com';
        scope.newWikiURL = url;
        scope.addWiki();

        expect(scope.wikis.length).toBe(1);
        expect(scope.wikis[0]).toBe(url);
        expect(scope.newWikiURL).toBe('');
    });
});

我收到一个错误消息,说对象没有addWiki方法。我尝试调试它,并且在测试过程中未调用链接函数。我怀疑这就是为什么addWiki方法不属于范围的原因。有人知道为什么我会收到此错误吗?

顺便说一句,在指令的链接函数中添加一些逻辑是正常的做法,因为它本身就是Controller?因为看代码我知道这就是为什么我在做。


问题答案:
  1. 您需要加载该模块包含您的指示,否则角不知道什么<wikis>

  2. 您的指令创建了一个隔离范围,因此,一旦编译完成,您需要使用 elem.isolateScope()

因此,有了这些更改:

describe('Wikis Directive Test Suite', function() {
    var $scope, scope, elem, directive, linkFn, html;

    beforeEach(module('app'));

    beforeEach(function() {
        html = '<wikis></wikis>';

        inject(function($compile, $rootScope, $templateCache) {
            $templateCache.put('templates/wiki-list.html', '<div>wiki template</div>');

            $scope = $rootScope.$new();
            $scope.wikis = [];

            elem = angular.element(html);

            $compile(elem)($scope);

            scope = elem.isolateScope();
            scope.$apply();
        });

    });

    it('add Wiki should add a valid wiki URL to artist', function() {
        var url = 'http://www.foo.com';
        scope.newWikiURL = url;
        scope.addWiki();

        expect(scope.wikis.length).toBe(1);
        expect(scope.wikis[0]).toBe(url);
        expect(scope.newWikiURL).toBe('');
    });
});

http://jsfiddle.net/QGmCF/1/



 类似资料:
  • 问题内容: 在AngularJS中对隔离范围进行单元测试的好方法是什么 JSFiddle显示单元测试 指令段 我想,以确保指令监听的变化-这确实 不是 工作,一个孤立的范围: 更新: 我通过检查是否将预期的观察者添加到了子作用域中来使其工作,但是它非常脆弱,并且可能以未记录的方式使用访问器(也可能随时更改,恕不另行通知!)。 更新2: 正如我提到的那样,它很脆!这个想法仍然有效,但是在新版本的An

  • 问题内容: 我首先尝试使用AngularJS自定义指令。 我在指令的链接功能中使用(或理解…)隔离范围时遇到麻烦。 这是我应用程序这部分的代码: view.html 是在viewCtrl范围内发布的变量,其中包含请求的xml字符串。 rawData.js raw-data.html 我不明白为什么弹出模式时会显示ID正确,但是当我尝试使用它时,其值是不确定的。 也许我对隔离的范围值(和)错了。 感

  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 问题内容: 我正在创建一个Java单元测试来测试一些我最近更改的代码。但是,我正在测试的方法实例化了一个使用ResourceBundle的类…… 资源文件位于Web包中,位于 我的测试保存在我的xml包中 在正常运行时,资源束是可访问的,但在运行单元测试时则不可访问。它引发此错误…… 我该怎么办?我可以启用测试以某种方式查看资源包吗?我可以在某个地方以某种方式看到代码的模拟资源文件吗? 问题答案:

  • 问题内容: 请在这里查看示例 角需要,,以在所述分离的范围对象从父范围访问它来限定。 在这里使用 那么,目的是什么?无法访问通过传递的所有属性。为什么不能将max的一个访问值代替 为什么要分配回来像? 由于此应用程序是由Angular作者编写的,因此我希望有一个理由。 谢谢。 问题答案: attrs的目的是什么? 在与指令相同的元素上定义的属性有几个用途: 它们是将信息传递到使用隔离范围的指令的唯

  • 问题内容: 作为Java程序的JIT编译结果,我得到了以下程序集列表。 我对指令的理解在这里是没有用的,因为测试的主要思想是 标记SF,ZF,PF被修改,而AND的结果被丢弃。 在这里,我们不使用这些结果标志。 是JIT中的错误还是我错过了什么?如果是,最好的报告地点在哪里?谢谢! 问题答案: 那一定是线程本地握手poll。看从哪里读取。如果是从(线程本地存储)偏移量读取的,那就是家伙。在这里查看