2013-10-16 14 views
5

Vorrei testare un controller, che genera un evento quando una proprietà cambia.Ember.js: come testare le azioni nel controller

Il controller simile a questa:

 App.MyController = Ember.Controller.extend({ 
      ... 
      observeFilterFieldChanges: function() { 
       console.log("observeFilterFieldChanges"); 
       this.setActiveSortField(); 
       this.send("queryChanged"); 
      }.observes("[email protected]"), 
      ... 
     }); 

E la mia prova è la seguente:

test('changing sort field via sort.fields will trigger query changed', function() { 
     var queryChangedCalled = false; 
     var tmpListController = App.MyController.create({ 
      actions: { 
       queryChanged: function() { 
        console.log("querychanged called from controller"); 
        queryChangedCalled = true; 
       } 
      } 
     }); 

     // trigger the change 
     tmpListController.set("sorting.fields.0.active", true); 
     stop(); 

     // not sure if I need to wait for the run loop to finish 
     Ember.run.schedule('afterRender', this, function() { 
      start(); 
      ok(queryChangedCalled, "querChangedCalled should be true"); 
     }); 

    }); 

Questo non funziona perché l'azione queryChanged nel controller non è mai chiamato. (Ma l'osservatore viene chiamato)

Qual è il modo migliore per testare se l'evento è stato inviato?

Aggiornamento per chiarezza: Il codice sopra riportato funziona perfettamente nell'app. L'azione inviata è ben consumata nella Route. Tutto quello che voglio è unit test per proteggermi dai cambiamenti futuri :)

+0

Sono grato che ti chiede una domanda di test brace. Tuttavia, ricevo messaggi misti dal tuo codice, sei più interessato a come attivare un osservatore? Il tuo codice non chiama semplicemente il metodo di invio dal tuo test? Entrambe sono domande interessanti, ma entrambe sarebbero meglio espresse con esempi di codice più succinti e possibilmente con un titolo diverso. –

risposta

0

Il modo migliore per testare un'azione è di attivarlo e asserire qualsiasi modifica this.setActiveSortField();.

Se l'osservatore non riesce, activeSortField non riesce ad asserire. Se le azioni falliscono, dovrebbe generare un errore.

moduleFor('controller:mycontroller', 'MyController Controller'); 

test('changing sort field via sort.fields will trigger query changed', function(assert) { 
assert.expect(1); 

// grab an instance of `MyController` 
var ctrl = this.subject(); 

Ember.run(function() { 

    ctrl.set('sorting.fields.0.active', true); 
    assert.equal(ctrl.get('activeSortField'), 'bar'); 
}); 

Consultare la guida di prova aggiornamento: http://emberjs.com/guides/testing/testing-controllers/

Problemi correlati