2014-07-14 2 views
4

Le contrôleur je voudrais tester contient les éléments suivants:Comment tester la fonction qui appelle Ember.run.debounce dans 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'), 

Maintenant, je voudrais écrire un test qui affirme que filteredFoos est mis à jour quand je mis filterText.

Pour ce faire correctement, je vais devoir prendre en compte Ember.run.debounce, et attendre que cela se produise avant d'effectuer mon assertion. Comment puis-je faire cela?

+0

Honnêtement, je 'd juste rebond debounce dans le test pour le faire revenir immédiatement (synchrone) et ajouter un test pour s'assurer que le talon a été appelé. – steveax

+0

@steveax Pourriez-vous m'en donner un exemple? – bguiz

Répondre

3

je courais dans ce problème aussi bien et pour bouchonner debounce, je ne les suivantes:

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(); 
}); 

La composante que je testais ressemble à ceci:

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

Donc, fondamentalement stok out debounce. Est-ce que tout le monde sait si le fait d'abattre les rebonds de cette façon pourrait nuire aux conditions du test? Devrait-on stocker une référence à un debounce original? –

+0

Vous pouvez sauvegarder la méthode 'debounce' et la restaurer lorsque vous avez terminé: ' var origDebounce = Ember.run.debounce; Ember.run.debounce = fonction (cible, func) { func.call (cible); }; . . . Ember.run.debounce = origDebounce; ' –

Questions connexes