Как протестировать .observes() в контроллере Ember?

Как вы можете протестировать функцию, которая наблюдает за свойством контроллера Ember?

Как это сделать, если метод наблюдения асинхронный (не возвращает результат сразу)?

Контроллер:

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

person bguiz    schedule 24.07.2014    source источник


Ответы (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

person Kingpin2k    schedule 24.07.2014
comment
Я предполагаю, что stop() и start() это QUnit.stop() и QUnit.start()? - person bguiz; 24.07.2014
comment
Я использую mockjax, потому что мне нужна его расширенная функциональность, которую не может предоставить ic-ajax. К сожалению, mockjax плохо синхронизируется с Ember.run.next(), как это делает ic-ajax. Поэтому мне пришлось использовать обещание, которое разрешалось в обратном вызове response хэша mockjax в сочетании с QUnit.start() и QUnit.stop(). Спасибо, что указали мне правильное направление! - person bguiz; 24.07.2014