我想测试的控制器包含以下内容:
filterText: '',
filteredFoos: (Ember.A()),
filterFoosImpl: function() {
console.log('filterFoos begin' );
var filterText = this.get('filterText');
var filteredFoos = this.forEach(function(foo) {
return (foo.get(name).indexOf(filterText) >= 0);
});
this.set('filteredFoos', filteredFoos);
},
filterFoos: function() {
Ember.run.debounce(this.filterFoosImpl.bind(this), 300);
}.observes('model', 'filterText'),
现在我想写一个test
,声称我设置filteredFoos
时filterText
已更新。
为了正确执行此操作,我需要考虑Ember.run.debounce
,
在我执行断言之前等待它发生。
我怎么能这样做?
答案 0 :(得分:3)
我也遇到了这个问题,为了排除debounce
,我做了以下事情:
test('it triggers external action on a keyup event', function() {
expect(1);
// stub out the debounce method so we can treat this call syncronously
Ember.run.debounce = function(target, func) {
func.call(target);
};
var component = this.subject();
var $component = this.append();
var targetObject = {
externalAction: function() {
ok(true, 'external action called');
}
};
component.set('keyUpAction', 'externalAction');
component.set('targetObject', targetObject);
$component.keyup();
});
我测试的组件看起来像这样:
export default Ember.TextField.extend({
triggerKeyUpAction: function() {
this.sendAction('keyUpAction', event);
},
keyUp: function(/*event*/) {
Ember.run.debounce(this, this.triggerKeyUpAction, 200);
if(!this.get('value')){
return;
}
this.set('value', String(this.get('value')).replace(/[^\d\.\,]/g, ''));
}
});
答案 1 :(得分:0)
添加
await settled();
断言之前
请参见https://guides.emberjs.com/v3.15.0/testing/testing-components/#toc_waiting-on-asynchronous-behavior,其中有一个关于Ember防抖的具体示例。
花点时间找我:)。