我正在尝试使用jasmine为我的angularjs指令传递测试。
我的指令只是接受传递给属性的内容(作为单向绑定),并用该值替换元素文本。我的指令还会监视值的变化并相应地更新元素文本:
return {
restrict: 'A',
scope: {
test: '&'
},
link: function (scope, element, attrs) {
element.text(scope.test());
scope.$watch('test', function (value) {
console.log('WATCH FIRED!');
element.text(scope.test());
});
}
};
我的jasmine测试尝试设置传递给指令的值,然后更改它,然后在更改值后检查元素文本是否不同:
it('should update when the model updates', function () {
$scope.model = 'hello';
$scope.$digest();
var before = element.text();
$scope.model = 'world';
$scope.$digest();
expect(element.text()).not.toEqual(before);
});
但是测试每次都失败了。事实上,元素文本总是“你好”,永远不会变成'世界'。
Plunker :http://plnkr.co/edit/UeUGE88LuQRgeo7I412p?p=preview
答案 0 :(得分:0)
这是因为您在指令(&
)中使用单向绑定,因此不会跟踪对模型的更改。尝试使用双向绑定=
,它应该按预期工作。
& binding允许指令在特定时间触发原始作用域上下文中表达式的求值。允许任何合法表达式,包括包含函数调用的表达式。因此,&绑定非常适合将回调函数绑定到指令行为。
...
return {
restrict: 'A',
scope: {
test: '='
},
link: function (scope, element, attrs) {
element.text(scope.text);
scope.$watch('test', function (value) {
console.log('WATCH FIRED!');
element.text(scope.test);
});
}
};
<强> Plnkr 强>
或者您需要这样做: -
scope.$watch(function(){
return scope.test();
}, function (value) {
console.log('WATCH FIRED!');
element.text(scope.test);
});