2014-07-14 3 views
4

Контроллер Я хотел бы, чтобы проверить, содержит следующее:Как проверить функцию, которая вызывает Ember.run.debounce в ember-qunit?

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

Честно говоря, я 'd просто заглушить debounce в тесте, чтобы он немедленно возвращался (синхронно) и добавлял тест, чтобы убедиться, что заглушка была вызвана. – steveax

+0

@steveax Не могли бы вы предоставить мне пример этого? – bguiz

ответ

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, '')); 
    } 
}); 
+0

Так что, в основном, вырезано извинение. Кто-нибудь знает, может ли разрушение отладки таким образом повредить условия тестирования? Должна ли быть сохранена ссылка на оригинальное debounce? –

+0

Вы можете создать резервную копию метода 'debounce' и восстановить его, когда вы закончите: ' var origDebounce = Ember.run.debounce; Ember.run.debounce = function (target, func) { func.call (target); }; . . . Ember.run.debounce = origDebounce; ' –