Ember.js + Mirage: подтянутое отношение в интеграционном тесте
У меня есть компонент, который использует this.get('model.property')
и работает как задумано.
Для моих интеграционных тестов я использую Mirage, который работал для всех моих других тестов (включая интеграционные тесты), однако, когда я тестирую этот конкретный компонент, я получаю:
TypeError: Cannot read property 'then' of undefined
Вот как выглядит мой тест:
import { moduleForComponent, test } from 'ember-qunit'
import hbs from 'htmlbars-inline-precompile'
import { startMirage } from 'app/initializers/ember-cli-mirage'
import Ember from 'ember'
moduleForComponent('summary-card', 'Integration | Component | summary card', {
integration: true,
beforeEach() {
this.server = startMirage()
},
afterEach() {
this.server.shutdown()
}
})
test('it renders', function(assert) {
const customer = this.server.create('customer')
const location = this.server.create('location', { customer })
const manufacturer = this.server.create('manufacturer')
const model = this.server.create('device-model', { manufacturer })
this.server.createList('device', 5, { model, customer, location })
const loc = Ember.Object.create(location)
this.set('model', loc)
this.render(hbs`{{summary-card model=model model-name=model.name tag='location' belongs-to='customer' has-many='device'}}`);
assert.equal(this.$('h1').text().trim(), 'Location 0', 'should be titled Location 0')
});
И в основном мой summary-card.js
есть что-то вроде этого:
this.get('model.' + belongs).then(relationship => {...})
где belongs
просто ценность того, что belongs-to
устанавливается, когда компонент вызывается.
Я немного озадачен, так как кажется, что макетная модель, которую я передаю на тест, на самом деле не представляет модель так же, как при работе ember s
(Я использую Mirage для разработки). Где я могу узнать больше о том, что там происходит?
Спасибо!
PS Я также пытался использовать location
объект, как это предусмотрено server.create()
и я получаю немного другую ошибку:
TypeError: _this.get(...).then is not a function
1 ответ
Хорошо, прочитав этот ответ, мне удалось найти собственное решение, которое работает очень хорошо:
import { moduleForComponent, test } from 'ember-qunit'
import hbs from 'htmlbars-inline-precompile'
import Ember from 'ember'
moduleForComponent('summary-card', 'Integration | Component | summary card', {
integration: true
})
test('it renders', function(assert) {
this.inject.service('store', {as: 'store'})
let location
Ember.run(() => {
location = this.store.createRecord('location', {
id: 0,
name: 'Location 0',
customer: this.store.createRecord('customer', {
id: 1,
name: 'Customer 0'
}),
devices: [this.store.createRecord('device', {id: 1})]
})
})
this.set('model', location)
this.render(hbs`
{{#summary-card model=model model-name=model.name tag='location' belongs-to='customer' has-many='device'}}
<div class='test-content'>Test Content</div>
{{/summary-card}}
`)
По сути, я выбрал использование магазина напрямую, а не Mirage, и он работает!