テスト要素ディレクティブ - テスト中に分離されたスコープメソッドにアクセスできない 質問する

テスト要素ディレクティブ - テスト中に分離されたスコープメソッドにアクセスできない 質問する

次のような指示があります。

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 メソッドがスコープの一部ではない理由だと思います。このエラーが発生する理由を知っている人はいますか?

ちなみに、ディレクティブのリンク関数自体がコントローラーになるので、そこに何らかのロジックを追加するのは普通のことでしょうか? コードを見ると、それが実際に私がやっている理由だと分かるからです。

ベストアンサー1

Angular 1.2.0のドキュメントによると、分離スコープを取得する方法はisolateScopeメソッドを使用することです。

  • scope() - 現在の要素またはその親のスコープを取得します。

  • isolateScope() - 現在の要素に直接アタッチされている場合は、分離スコープを取得します。このゲッターは、新しい分離スコープを開始するディレクティブを含む要素でのみ使用する必要があります。この要素で scope() を呼び出すと、常に元の非分離スコープが返されます。

Angular ドキュメント - セクション jQuery/jqLit​​e Extras

重大な変更: jqLit​​e#scope()

おすすめ記事