AngularJS和Jasmine:isolateScope()未定义

时间:2016-08-11 18:27:03

标签: javascript angularjs testing jasmine directive

经过两天的研究和测试,我需要寻求帮助。 我正在尝试使用Jasmine测试指令,我不想包含Karma引擎。

为了查看测试结果,我使用了jasmine-html库和jasmine css。

我能够轻松地测试服务,但是当涉及到测试指令时,我无法访问隔离的范围。要记住的一件事是我不想在我的指令中使用控制器,而是链接函数。 (根据Angular doc,仅当您希望将API公开给其他指令时,才应使用控制器。)

我在StackOverflow上找到了多个答案,但没有一个有效。
我尝试的最后一件事是基于this回答的问题StackOverflow。 这是我试图复制的测试

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);

        elem= $compile(elem)($scope);
        //scope = elem.isolateScope(); /*This is always undefined!*/
        scope = elem.scope(); /* this doesn't have addWiki, only the empty wikis array  */
        $rootScope.$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('');
    });
});

“唯一”的区别是,我需要使用Jasmine 2.4.1和Angular 1.0.7。不幸的是,似乎这些库的测试不起作用。 问题是isolateScope()总是未定义的!

我已经创建了一个可以重现问题的plunker。

https://plnkr.co/edit/PRt350VlASShg5oVeY88

1 个答案:

答案 0 :(得分:0)

好吧,我(其中一位同事发现了)我做错了什么!

这是正确的代码。

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);
            elem = $compile(elem)($scope);
            $scope.$digest();
            scope = elem.isolateScope();
        });

    });

    it('add Wiki should add a valid wiki URL to artist',inject( 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('');
    }));
});