【问题标题】:How to test .observes() in an Ember controller?如何在 Ember 控制器中测试 .observes()?
【发布时间】:2014-07-24 04:13:04
【问题描述】:

如何测试观察 Ember 控制器属性的函数?

observes 方法是异步的(不立即返回)怎么办?

控制器:

var FooController = Ember.Controller.extend({
    bar: 1,
    baz: null,

    barObserver: function() {
        var req = ic.ajax.raw({
            method: 'POST',
            url: '/api/bar',
            data: { bar: bar },
        });
        return req.then(function resolve(result) {
            this.set('baz', result.response.baz);
        });
    }.observes('bar'),
});

单元测试:

test('barObserver', function() {
    var ctrl = this.subject();
    equal(ctrl.get('baz'), null, 'baz initially null');

    Ember.$.mockjax({
        url: '/api/bar',
        'type': 'POST',
        dataType: 'json',
        response: function() {
            this.responseText = { baz: 'something' };
        },
    });

    ctrl.set('bar', 2);
    //wait for barObserver's promise (from ic.ajax.raw) to return
    equal(ctrl.get('baz'), 'something', 'baz set to returned value');
});

【问题讨论】:

    标签: javascript ember.js qunit observers


    【解决方案1】:

    您也可以使用 ic-ajax 来定义模拟响应。此外,您可以停止并开始测试此类异步问题。

    test('barObserver', function() {
      var ctrl = FooController.createWithMixins(); // I was to lazy to set up ember qunit
      equal(ctrl.get('baz'), null, 'baz initially null');
    
      ic.ajax.defineFixture('/api/bar', {
        response: { baz: 'something' },
        jqXHR: {},
        textStatus: 'success'
      });
    
      ctrl.set('bar', 2);
    
      // allow everything else to run (skip a beat)
      // and then continue testing (essentially allowing ic-ajax to resolve)
      stop();
      Em.run.next(function(){ 
        start();
        equal(ctrl.get('baz'), 'something', 'baz set to returned value');
      });
    
    });
    

    伪示例:http://jsbin.com/OxIDiVU/853/edit

    【讨论】:

    • 我假设stop()start()QUnit.stop()QUnit.start()?
    • 我正在使用 mockjax,因为我需要它的一些高级功能,而 ic-ajax 无法提供。不幸的是,mockjax 不能像 ic-ajax 那样与Ember.run.next() 很好地同步。所以我不得不使用一个可以在 mockjax 哈希的response 回调中解决的promise,并结合QUnit.start()QUnit.stop()。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2016-08-03
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多