我已经看到,为了模拟由指令生成的DOM上的用户操作,有两种方法,都可以触发事件:
How to trigger ng-change in directive test in AngularJS
第一种方法使用jquery,第二种方法使用 angular-scenario.js 中定义的名为 browserTrigger 的函数。第二个应该是更好的,因为jquery会在事件触发时出现错误(我相信,我不是在争论:)。
使用角度场景意味着对我进行e2e测试。但我看到egghead video,他似乎在进行单元测试。这怎么可能?
我猜他刚刚复制了这个函数?
我认为我将测试指令作为e2e测试,它更有意义,因为单元测试是更纯粹的功能。
好吧,我刚发现browserTrigger是内部不应该直接使用的东西:https://github.com/angular/angular.js/issues/5178
谢谢!
答案 0 :(得分:9)
从1.3.15开始,您可以使用triggerHandler触发事件,如下所示,
it('should click the element',function(){
element.triggerHandler('click') ;
expect($scope.clicked).toBe(true);
});
答案 1 :(得分:1)
简单而且有效,例如,在单元测试环境中:
spyOn(self, 'updateTransactionPrice');
var el = compile('<form name="form" latest novalidate json-schema="main.schema_discount" json-schema-model="main._data"><input type="text" ng-model="main._data.reverse_discount" ng-class="{ \'form-invalid\': form.reverse_discount.$invalid }" ng-change="main.transactionPrice(form);" name="reverse_discount" class="form-control-basic" placeholder="" ng-disabled="!main.selectedProduct.total_price"></form>')(scope);
el.find('input').triggerHandler('change');
expect(self.updateTransactionPrice).toHaveBeenCalled();