Как проверить действие willTransition маршрута в Ember?

Как я могу протестировать этот код в Ember? Объясните мне пожалуйста концепцию, в общем.

// app/routes/products/new.js
import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.store.createRecord('product');
  },
  actions: {
    willTransition() {
      this._super(...arguments);
      this.get('controller.model').rollbackAttributes();
    }
  }
});

Я понятия не имею, как это сделать. Может быть модель-заглушка в пути? Я обнаружил, что магазин недоступен в тесте маршрута.

После Ruby и RSpec весь этот новый мир javascript немного сбивает с толку) Но я все равно хотел бы его изучить.


person Molfar    schedule 10.10.2016    source источник
comment
Код неверный ;), willTransition это хук, а не действие. Не помещайте его в хэш actions. И вы могли бы просто позвонить ему, чтобы отдохнуть. Вы можете заглушить магазин.   -  person Lux    schedule 10.10.2016
comment
@Lux, чтобы записать нашу логику в хук willTransition, мы должны определить ее в действиях, верно?   -  person Ember Freak    schedule 10.10.2016
comment
@Lux, Хм, знаете, согласно руководству guides .emberjs.com/v2.8.0/routing/ willTransition отображается в хеше действий. При попытке перехода, будь то через {{link-to}}, transitionTo или изменение URL-адреса, действие willTransition запускается на активных в данный момент маршрутах. - они называют это действием, а не крючком.   -  person Molfar    schedule 10.10.2016
comment
Не связанный, но currentModel является частным методом и не является способом Ember для захвата вашей.....текущей модели.... в маршруте: github.com/emberjs/ember.js/issues/11760 Я пока не очень разбираюсь в тестировании в Ember, но если вы не можете получить доступ к магазину из тест, я не уверен, что вы можете проверить это. Атрибуты отката, в данном примере, удалят несохраненную модель из хранилища или удалит любые несохраненные изменения из существующей модели — опять же из хранилища.   -  person bambery    schedule 11.10.2016
comment
хорошо, очевидно, я был неправ. простите. Это интересно.   -  person Lux    schedule 11.10.2016


Ответы (1)


В модульных тестах идея состоит в том, чтобы заглушить все внешние зависимости. В Ember вы можете сделать это:

// tests/unit/products/new/route-test.js
test('it should rollback changes on transition', function(assert) {
  assert.expect(1);
  let route = this.subject({
    controller: Ember.Object.create({
      model: Ember.Object.create({
        rollbackAttributes() {
          assert.ok(true, 'should call rollbackAttributes on a model');
        }
      })
    })
  });
  route.actions.willTransition.call(route);
});

По сути, вы заглушаете контроллер и модель, передавая их this.subject(), затем вызываете любую тестируемую функцию (в этом случае вы должны использовать call или apply для вызова действия с правильной областью действия), а затем утверждаете, что rollbackAttributes() был вызван.

assert.expect(1); в начале теста указывает QUnit ожидать ровно 1 утверждения.

person jetpackpony    schedule 14.12.2016
comment
Небольшое замечание: вместо route.actions.willTransition.call(route); можно было бы использовать route.send('willTransition');. - person Alan Dong; 30.07.2019