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 для целей разработки). Есть ли где-нибудь, где я могу узнать больше о том, что именно там происходит?

Благодарю вас!


P.S. Я также пытался использовать объект location, предоставленный server.create(), и получаю немного другую ошибку:

TypeError: _this.get(...).then is not a function


person finferflu    schedule 08.08.2017    source источник


Ответы (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, и это работает!

person finferflu    schedule 08.08.2017