#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);
});
Комментарии:
1. Но как бы вы внедрили макет, который присутствует в тесте this.subject()?
2. Я вижу, просто передайте макет как объект в this.subject()