Инициализированная зависимость отсутствует при тестировании

#ember.js #ember-cli #ember-qunit

#ember.js #ember-cli #ember-qunit

Вопрос:

Я использую ember-cli 0.0.35 и внедряю зависимость в свой компонент через инициализатор. Он отлично работает в разработке, но свойство отсутствует при запуске тестов. Похоже, что тестирование вызывает loadInitializers, но зависимость не отображается для this.subject({});

Я не хочу вручную вводить ее для тестов. Есть ли лучший способ справиться с этим?

Инициализатор:

 var FooServiceInitializer = {
  name: 'foo',
  initialize: function (container, application) {
   application.inject('component:foo', 'foo', 'service:foo');
  }
};
export default FooServiceInitializer;
 

Сбой теста:

 moduleForComponent('bar', 'Component: Bar', {
  setup: function() {
    App = startApp();
    component = this.subject({});
  },
  teardown: function () {
    Ember.run(App, App.destroy);
  }
});

test('Properties: foo', function() {
  // Make sure we injected the service
  ok(component.foo, 'foo is injected');
});
 

Комментарии:

1. Проблема в том, что ic-ajax действительно предназначен больше для модульных тестов, а не для интеграционных тестов. Вся цель заключается в тестировании одной единицы работы. И внедрение контейнера определенно выходит за рамки.

Ответ №1:

Как я уже говорил ранее, это действительно подходит для интеграционного теста, поскольку на данный момент вы тестируете контейнер (а не мини-контейнер, созданный ic-ajax).

Ваш реальный тест соответствует этому

 test("root lists 3 colors", function(){
  var c = App.__container__.lookup('component:foo-bar');
  ok(c.foo.blah);
});
 

Если вы чувствуете вину за использование контейнера во время тестирования (чего делать не следует), вы можете создать помощника, чтобы избежать необходимости исправлять его повсюду, когда / если api изменится в будущем.

 Ember.Test.registerHelper('containerLookup',
  function(app, look) {
    return app.__container__.lookup(look);
  }
);
 

Убедитесь, что вы определили это раньше

 App.injectTestHelpers();
 

и тогда ваш тест будет выглядеть так

 test("root lists 3 colors", function(){
  var c = containerLookup('component:foo-bar');
  ok(c.foo.blah);
});
 

http://emberjs.jsbin.com/doxigu/edit

Комментарии:

1. Но как бы вы внедрили макет, который присутствует в тесте this.subject()?

2. Я вижу, просто передайте макет как объект в this.subject()