2013-10-16 17 views
5

Ich möchte Unit-Test einen Controller testen, der ein Ereignis auslöst, wenn sich eine Eigenschaft ändert.Ember.js: Wie Aktionen im Controller getestet werden

Der Controller sieht wie folgt aus:

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

Und mein Test ist die folgende:

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

    }); 

Das funktioniert nicht, weil die Aktion in der Steuerung queryChanged nie aufgerufen. (Aber der Beobachter wird gerufen)

Was ist der beste Weg zu testen, ob das Ereignis gesendet wurde?

Update für Klarheit: Der obige Code funktioniert gut in der App. Die gesendete Aktion wird in der Route gut aufgenommen. Alles, was ich will, ist Komponententest, um mich vor zukünftigen Änderungen zu schützen :)

+0

Ich bin dankbar, dass Sie eine ember Prüfung Frage zu stellen. Ich bekomme jedoch gemischte Nachrichten aus Ihrem Code, sind Sie mehr daran interessiert, einen Beobachter auszulösen? Sendet Ihr Code die send-Methode nicht einfach aus Ihrem Test? Beides sind interessante Fragen, aber beide würden besser mit prägnanten Codebeispielen und möglicherweise einem anderen Titel ausgedrückt. –

Antwort

0

Der beste Weg, um eine Aktion zu testen, ist es zu triggern und zu bestätigen, was auch immer this.setActiveSortField(); Änderungen.

Wenn der Beobachter fehlschlägt, schlägt activeSortField fehl. Wenn die Aktionen fehlschlagen, sollte ein Fehler ausgegeben werden.

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

Siehe die aktualisierte Test Guide: http://emberjs.com/guides/testing/testing-controllers/

Verwandte Themen