Ember.js:如何测试控制器中的动作

时间:2013-10-16 09:07:14

标签: ember.js

我想对一个控制器进行单元测试,该控制器会在属性发生变化时触发事件。

控制器看起来像这样:

        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。 (但是观察者确实被召唤了)

测试事件是否发送的最佳方法是什么?

为清晰起见更新: 以上代码在App中运行良好。在路线中很好地消耗了发送的动作。我想要的只是单元测试以保护我免受未来的变化:)

1 个答案:

答案 0 :(得分: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/