5

プロパティが変更されたときにイベントを発生させるコントローラーを単体テストしたいと思います。

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

        App.MyController = Ember.Controller.extend({
           ...
            observeFilterFieldChanges: function() {
                console.log("observeFilterFieldChanges");
                this.setActiveSortField();
                this.send("queryChanged");
            }.observes("sorting.fields.@each.active"),
           ...
        });

そして、私のテストは次のとおりです。

    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 が呼び出されないため、これは機能しません。(ただし、オブザーバーは呼び出されます)

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

わかりやすくするための更新: 上記のコードはアプリでうまく機能します。送信されたアクションは、ルートで適切に消費されます。私が望むのは、将来の変更から私を守るための単体テストです:)

4

1 に答える 1

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/

于 2014-04-15T12:43:32.687 に答える