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 回答