Javascript 在jasmin中测试角度复选框

Javascript 在jasmin中测试角度复选框,javascript,angularjs,checkbox,jasmine,karma-runner,Javascript,Angularjs,Checkbox,Jasmine,Karma Runner,我的情况如下: 指令 scope: { foo:'=' }, template: '<input type="checkbox" ng-model="foo"/>' 茉莉花试验 var cb = iElement.find('input'); $timeout(function() { // using $timeout to ensure $digest() isn't the issue. cb.prop('checked',!cb.prop('checked'))

我的情况如下:

指令

scope: { foo:'=' },
template: '<input type="checkbox" ng-model="foo"/>'
茉莉花试验

var cb = iElement.find('input');

$timeout(function() {  // using $timeout to ensure $digest() isn't the issue.
    cb.prop('checked',!cb.prop('checked'))
},0);

expect(cb.prop('checked')).toBe(true); // passes

expect($scope.foo).toBe(true); // doesn't pass
我的问题是:为什么$scope.foo在我发出prop('checked')时没有得到更新,即使DOM得到了更新(正如我在检查后验证的那样)

下面是一个jsbin,它大致演示了这个问题

expect($scope.$parent.foo).toBe(true);
更新答案:

$timeout(function() {  // using $timeout to ensure $digest() isn't the issue.
      //cb.prop('checked',!cb.prop('checked'));  
      $scope.val = !cb.prop('checked');

},0);

您希望将所有更新保持在范围级别,并让angular自行管理周期。如果更新了该属性,您将脱离angular的雷达

进一步调查后-当您将ng模型添加到复选框中时,angular似乎会添加一个
单击
侦听器


因此,正确的测试方法似乎是在jasmine测试中对DOM对象发出一个
单击事件

因此完整的答案是: 您需要更改“checked”属性,然后触发click事件

var input = element.find('input');
input.prop('checked',!input.prop('checked'));
// input.triggerHandler('click');
input.triggerHandler('change');

谢谢凯文,这对我帮助很大

@egoproxy answer最终帮助了我,但我在使用原始dom元素时遇到了问题。为了解决这个问题,我使用了
angular.element(domeElement)
它:将原始DOM元素或HTML字符串包装为jQuery元素

var checkbox=angular.element(checkboxElement));
//单击以选中它,然后更改为propate to ngModel
checkbox.trigger('click');
checkbox.trigger('change');

我猜你指的是$scope.$parent。无论如何,那里不存在foo。如果我理解正确,为了访问该指令创建的隔离范围,我需要使用返回的范围,例如:
ele=angular.element(“”)
$compile(ele)($rootScope)
isolated_scope=ele.scope()很抱歉输入错误。修正了答案。模板中的新输入有自己的作用域。您传递了该值,但应该能够访问父值。也许我的问题不清楚-在这个jsbin示例中:为什么我的范围变量
$scope.val
没有得到更新?如果我做对了,您希望通过单击按钮来更新复选框和标签。为此,请替换行“cb.prop('checked',!cb.prop('checked');”使用“$scope.val=!”!cb.prop('checked');'-你说得对,确实有效,但不是我需要/想要的方式。如果您注意到,$scope.val与checkbox指令的ng模型相关联,那么在我看来,如果复选框从选中变为未选中,ng模型应该接受此更改是有意义的。或者我对MVC是如何交互的理解是有偏差的。不管是哪种情况,我想我现在可以按照你上面的建议做点什么。谢谢。问了另一种方法-测试复选框(位于指令中)的正确方法是什么?谁的ng模型链接到其父控制器中的变量?实际上-我最近遇到了一个问题(可能与使用
单击
有关),Firefox无法拾取单击事件(或者可能更改没有执行
$digest
循环-不管我在
单击后直接显式调用
$digest()
——尽管Chrome和PhantomJS中都通过了测试。不确定发生了什么…谢谢@Kevin您的评论在我的测试el.prop中保存了我的一天('checked',true)不起作用,但一旦更改为el.click(),模型已正确更新
var input = element.find('input');
input.prop('checked',!input.prop('checked'));
// input.triggerHandler('click');
input.triggerHandler('change');