Как мне зависеть от магазина как службы в модульных тестах Ember с использованием qunit?

Согласно сообщению в блоге для ember-data версия 1.0.0-beta.16 Магазин теперь можно использовать как сервис:

TweetComposerComponent = Ember.Component.extend({
  store: Ember.inject.service()      
});

Тем не менее, я не могу понять, как это сделать qunit модульные тесты на таком компоненте. Я пробовал следующее:

moduleForComponent('tweet-composer', {
  needs: ['service:store']
});

а также:

moduleForComponent('tweet-composer', {
  needs: ['store:main']
});

И когда я делаю первое, я получаю ошибку Attempting to register an unknown factory: 'service:store' и если я сделаю последнее, то store является undefined,

Мысли?

(Я пишу ember-cli приложение стиля).

Обновить:

Кажется, в репозитории ember-test-helpers есть открытая проблема для этого.

Пока я жду этого исправления, я приготовил помощника, который может работать как мера остановки (coffeescript):

`import TestModuleForComponent from 'ember-test-helpers/test-module-for-component'`
`import { createModule } from 'ember-qunit/qunit-module'`

# This assumes the last argument, the callbacks, is present, although it
# does support the description being an optional argument.
moduleForStoreComponent = ->
  args = Array.prototype.slice.call arguments
  callbacks = args[args.length-1]
  # Wrap the original beforeEach callback in a modified version that
  # also sets up the store for the test container.
  originalSetup = callbacks.beforeEach
  callbacks.beforeEach = ->
    DS._setupContainer(@container)
    originalSetup.call(@) if originalSetup
  callbacks.store = ->
    @container.lookup('store:main')
  args.unshift TestModuleForComponent
  createModule.apply @, args

`export default moduleForStoreComponent`

1 ответ

Модульный тест - это место, где все отлично работает, кроме кода / компонента / модуля, который вы тестируете.

Так что даже store следует предположить, что он работает отлично (0 ошибок / ошибок).

Примерно так должно работать в вашем тесте:

moduleForComponent('tweet-composer', {
    beforeEach: function() {
        this.subject({
            store: {/*empty object*/}
        });
    }
});

Если части ваших тестов зависят от данных, извлеченных из магазина, вы можете сделать что-то вроде:

this.subject({
    store: {
        find: function() {
          var mockedModel = Ember.Object.create({/*empty*/});
          return mockedModel;
        }
    }
});

Это необходимо для сохранения статуса "модульного теста", если вы начнете включать и регистрировать другие объекты из своего приложения, вы фактически будете писать интеграционные тесты.

Замечания:

В общем, поиск моделей непосредственно в компоненте - это анти-шаблон, и вы должны предпочесть передать любую модель, которая вам нужна, в шаблоне, который включает компонент.

http://discuss.emberjs.com/t/should-ember-components-load-data/4218/2?u=givanse

Другие вопросы по тегам