gpt4 book ai didi

javascript - 如何在 AngularJS 中对独立作用域指令进行单元测试

转载 作者:IT王子 更新时间:2023-10-29 02:46:50 26 4
gpt4 key购买 nike

在 AngularJS 中单元测试隔离范围的好方法是什么

JSFiddle showing unit test

指令片段

    scope: {name: '=myGreet'},
link: function (scope, element, attrs) {
//show the initial state
greet(element, scope[attrs.myGreet]);

//listen for changes in the model
scope.$watch(attrs.myGreet, function (name) {
greet(element, name);
});
}

我想确保指令正在监听更改 - 这适用于隔离范围:

    it('should watch for changes in the model', function () {
var elm;
//arrange
spyOn(scope, '$watch');
//act
elm = compile(validHTML)(scope);
//assert
expect(scope.$watch.callCount).toBe(1);
expect(scope.$watch).toHaveBeenCalledWith('name', jasmine.any(Function));
});

更新:我通过检查是否将预期的观察者添加到子范围来让它工作,但它非常脆弱并且可能以未记录的方式使用访问器(也可能会更改,恕不另行通知!)。

//this is super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.scope().$$watchers[0].exp).toBe('name');

更新 2:正如我提到的,这很脆弱!这个想法仍然有效,但在较新版本的 AngularJS 中,访问器已从 scope() 更改为 isolateScope():

//this is STILL super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.isolateScope().$$watchers[0].exp).toBe('name');

最佳答案

参见 angular element api docs .如果您使用 element.scope(),您将获得您在指令的 scope 属性中定义的元素范围。如果您使用 element.isolateScope(),您将获得整个隔离范围。例如,如果您的指令看起来像这样:

scope : {
myScopeThingy : '='
},
controller : function($scope){
$scope.myIsolatedThingy = 'some value';
}

然后在您的测试中调用 element.scope() 将返回

{ myScopeThingy : 'whatever value this is bound to' }

但是如果你调用 element.isolateScope() 你会得到

{ 
myScopeThingy : 'whatever value this is bound to',
myIsolatedThingy : 'some value'
}

从 Angular 1.2.2 或 1.2.3 开始,这是正确的,不确定。在以前的版本中,您只有 element.scope()。

关于javascript - 如何在 AngularJS 中对独立作用域指令进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com