2013-10-16 18 views
5

プロパティの変更時にイベントを発生させるコントローラをユニットテストしたいと思います。Ember.js:コントローラのアクションをテストする方法

コントローラは次のようなものになります。

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

をそして、私のテストでは、以下の通りである。

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

    }); 

コントローラにqueryChangedアクションが呼び出されることはありませんので、これは動作しません。 (しかし、オブザーバーが呼び出される)

イベントが送信されたかどうかをテストする最良の方法は何ですか?

明快にするための更新: 上記のコードは、アプリケーションで素晴らしい動作します。送信されたアクションはルートでうまく消費されます。私が望むのは、将来の変更から私を守るための単体テストです。

+0

私はあなたが燃えさしテストの質問をして感謝しています。しかし、あなたのコードからメッセージが混ざり合っています。オブザーバーをトリガする方法にもっと興味がありますか?あなたのコードは単にあなたのテストからsendメソッドを呼び出さないのですか?どちらも興味深い質問ですが、どちらも簡潔なコード例と異なるタイトルで表現する方が良いでしょう。 –

答えて

0

アクションをテストする最良の方法は、それをトリガーして何かをアサートすることです。this.setActiveSortField();が変更されます。

オブザーバに障害が発生すると、activeSortFieldはアサートに失敗します。 アクションが失敗すると、エラーが発生します。

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

が更新され、テスト・ガイドを参照してください:http://emberjs.com/guides/testing/testing-controllers/

関連する問題