Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在余烬控制器中测试.observes()?_Javascript_Ember.js_Qunit_Observers - Fatal编程技术网

Javascript 如何在余烬控制器中测试.observes()?

Javascript 如何在余烬控制器中测试.observes()?,javascript,ember.js,qunit,observers,Javascript,Ember.js,Qunit,Observers,如何测试观察余烬控制器属性的函数 当observes方法是异步的(不立即返回)时,如何实现这一点 控制器: var FooController = Ember.Controller.extend({ bar: 1, baz: null, barObserver: function() { var req = ic.ajax.raw({ method: 'POST', url: '/api/bar',

如何测试观察余烬控制器属性的函数

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

您还可以使用icajax来定义模拟响应。此外,您还可以停止并开始测试类似这样的异步问题

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

});

伪示例:

我假设
stop()
start()
quonit.stop()
quonit.start()
?我使用mockjax,因为我需要它的一些高级功能,而ic ajax无法提供这些功能。不幸的是,mockjax没有像icajax那样与
Ember.run.next()很好地同步。因此,我必须使用一个承诺,该承诺将在mockjax散列的
响应
回调中与
quonit.start()
quonit.stop()
相结合来解决。谢谢你给我指明了正确的方向!