Как я могу зависеть от магазина как службы в модульных тестах Ember с помощью qunit?
В соответствии с blog-post для ember-data
version 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
).
Update:
Кажется, существует открытая проблема для этого в репо-сервере ember-test-helers.
Пока я жду этого исправления, я приготовил помощника, который может работать как мера остановки (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
A unit test - это место, где все работает отлично, за исключением того, что тестируемый код/компонент/блок.
Таким образом, даже 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;
}
}
});
Чтобы сохранить статус "unit test", если вы начнете включать и регистрировать другие объекты из своего приложения, вы действительно будете писать тесты интеграции.
Примечание:
В целом, поиск моделей непосредственно в компоненте - это анти-шаблон, и вы должны предпочесть переходить в любую модель, которая вам нужна в шаблон, включающий компонент.
http://discuss.emberjs.com/t/should-ember-components-load-data/4218/2?u=givanse