angularjs单元测试中的作用域一直未定义

angularjs单元测试中的作用域一直未定义,angularjs,unit-testing,scope,angularjs-scope,Angularjs,Unit Testing,Scope,Angularjs Scope,我正在尝试对以下代码进行单元测试,我为单元测试编写了以下代码,如下所示,我尝试了很多方法,但我不断遇到错误: '无法读取未定义的'num'属性' 我不知道为什么范围设置不正确。如果你对此有任何想法,你能给我一些建议吗 var angular = require('angular'); require('angular-mocks'); describe('test directive', function () { let $rootScope; let $compile;

我正在尝试对以下代码进行单元测试,我为单元测试编写了以下代码,如下所示,我尝试了很多方法,但我不断遇到错误:

'无法读取未定义的'num'属性'

我不知道为什么范围设置不正确。如果你对此有任何想法,你能给我一些建议吗

var angular = require('angular');
require('angular-mocks');

describe('test directive', function () {

    let $rootScope;
    let $compile;
    let scope;
    let newScope;
    let element;

    beforeEach(angular.mock.inject(function (_$compile_, _$rootScope_) {
        $compile = _$compile_;
        $rootScope = _$rootScope_;
    }));

    describe('test directive', function () {

        beforeEach(function () {
            newScope = $rootScope.$new();
            element = $compile('<test-directive></test-directive>')(newScope);
            newScope.$digest();
            scope = element.isolateScope();
        });

        fit('scope initialized', function () {
            expect(scope.num).toEqual(1);
        });

    });
});

scope
变量是
未定义的
,因为正在测试的指令没有隔离作用域。相反,请使用元素的范围:

    beforeEach(function () {
        newScope = $rootScope.$new();
        element = $compile('<test-directive></test-directive>')(newScope);
        newScope.$digest();
        ̶s̶c̶o̶p̶e̶ ̶=̶ ̶e̶l̶e̶m̶e̶n̶t̶.̶i̶s̶o̶l̶a̶t̶e̶S̶c̶o̶p̶e̶(̶)̶;̶
        scope = element.scope();
    });

    fit('scope initialized', function () {
        expect(scope.num).toEqual(1);
    });
在每个(函数()之前{
新闻范围=$rootScope.$new();
元素=$compile(“”)(新闻范围);
新闻镜。$digest();
"s,c,o,p,e"e,l,e,m,e,n,t","i,s,o,l,t,e,s,c,t"(p)
scope=element.scope();
});
fit('范围已初始化',函数(){
expect(scope.num).toEqual(1);
});

请注意,该指令有一个致命的缺陷。在给定的范围内,它只能使用一次。

如果指令中没有使用$rootScope,为什么还要引用它?实际上,我使用它进行广播,这里不包括它。你看到了吗?我已经查看了它,但仍然有问题。是的,我可以从中获得一些信息,但它返回的是ChildScope而不是scope,您知道为什么会发生这种情况吗?它返回一个
ChildScope
,因为它继承了
$rootScope
的属性。新闻范围应该是ChildScope,但范围应该是特定于元素的范围,但事实并非如此。如果指令定义对象中省略了
scope
属性,则不会为指令创建任何范围。看,我实际上已经试过了,范围:{}像这样。但它仍然不起作用,我们将进一步研究它。