如何在茉莉+角形中测试指令的隔离镜的双向绑定
How to test two-way binding with directive's isolateScope in jasmine+angular?
我想测试父范围在指令更改后是否获得新值,但由于某种原因它不起作用。
这是我的指示
angular.module('myModule').directive('myDirective', function(){
return {
template: 'just a template',
restrict: 'A',
scope: {
'model' : '=myDirective'
},
link: function postLink( scope ){
scope.changeModelValue = function( value ){
scope.model = value;
}
}
}
});
这是我的考验
describe('the test', function(){
var scope, isolateScope, element;
var reset = function(){
scope = null;
isolateScope = null;
element = null;
};
beforeEach( inject(function( $rootScope ){
scope = $rootScope.new();
reset();
}));
var setup = inject(function( $compile ){
element = angular.element('<div my-directive="item"></div>');
element = $compile(element)(scope);
scope.$digest();
isolateScope = element.children().scope();
});
it('should work', inject(function( $timeout ){
scope.item = null;
setup();
expect(typeof(isolateScope.changeModelValue)).toBe('function'); // works!
isolateScope.changeModelValue('new value');
expect(isolateScope.model).toBe('new value'); // works!
// tried all the of this - but didn't help..
waitsFor(function(){
try{ $timeout.flush(); } catch (e) { }
try{ scope.$digest.flush(); } catch (e) { }
try{ isolateScope.$digest(); } catch (e) { }
return scope.reportLesson !== null;
});
runs(function(){
expect(scope.item).toBe('new value'); //fails!!
});
}));
});
如您所见,我尝试了一些刷新等,认为可能需要发生一些异步操作才能使其工作,但它没有帮助。
测试在等待时达到超时。
我怎样才能让它工作?
事实证明,$digest
和 $timeout.flush
不会影响绑定。
为了使它起作用,我不得不打电话给isolateScope.$apply()
.我仍然想对此有一个解释。
呃,
我可能是错的,但看起来你在那里进行绑定的方式没有意义。
// 2-way-bind the value of 'model' in this scope to the myDirective attribute in the parent scope
scope: {
'model' : '=myDirective'
},
如果那是"=item",那么考虑到您想要的,这是有意义的,所以请尝试一下。
你正在做的另一件事有点奇怪:
// Give my directive an attribute which is the 'item' element from the scope
element = angular.element('<div my-directive="item"></div>');
所以这有点奇怪,请阅读这个答案:AngularJS指令值
你用属性重载指令声明,并且将范围变量与属性混合在一起(可以通过链接函数访问,但不能访问你正在做的事情)。
编辑:
最后一点,你应该相信AngularJS正确地进行了绑定。编写这些类型的测试非常耗时,您应该专注于程序逻辑。
相关文章:
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- 从控制器继承了隔离的作用域以生成可重用的指令
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- AngularJS指令隔离作用域
- 访问多个指令的隔离作用域
- 如何在隔离作用域指令中访问此作用域变量
- AngularJs,在没有隔离的情况下将指令属性添加到作用域
- AngularJS:ngRepeat作用域在具有隔离作用域和ngTransclude的自定义指令中失败
- 将回调绑定到没有隔离作用域的指令
- 在不使用隔离作用域的情况下执行函数的角度指令
- 如果指令包含在另一个指令中,我如何在隔离范围内添加双向数据绑定属性
- 指令隔离范围1.2.2
- 隔离范围-仅在指令范围内定义的值必须执行更改
- 隔离未更新指令中值的作用域
- 使用隔离作用域的角度指令
- 在AngularJS中对指令的隔离作用域设置新属性
- $scope变量在指令隔离作用域中未定义
- AngularJS将属性中的URL传递到指令的隔离范围-意外的令牌':'
- mocking和测试指令,隔离范围包含ng模型
- $watch使用隔离范围时从角度指令内部更改值