Ember Mirage не пропускает модель как тлеющий объект - PullRequest
0 голосов
/ 05 июля 2018

Использование последней версии Ember (3.2), ember-cli-mirage 0.4.7, ember-cli-qunit 4.3.2, ember-qu-quit 3.4.1

Я использую ember-cli-mirage для тестирования внешнего интерфейса, я не могу обойти эту ошибку:

Uncaught TypeError: template.getProperties is not a function

Я запускаю это в тесте компонента:

import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';

module('Integration | Component | template-editor', function(hooks) {
  setupRenderingTest(hooks);
  setupMirage(hooks);

  test('it renders', async function(assert) {
    const mockTemplate = server.create('template');
    this.set('mockTemplate', mockTemplate);
    await render(hbs`{{template-editor template=mockTemplate}}`);
    assert.equal(this.get('template.name'), 1);
  });
});

И соответствующая часть моего JS-файла компонентов такова:

export default Component.extend({
    init () {
        this._super(...arguments);
        let template = this.get('template');
        if ( template ) {
            let oldProperties = template.getProperties('body','subject');
            this.set('oldProperties',oldProperties);
        }
    }
});

Может показаться, что модель миража - это не тот объект, который ожидает мой код в реальной жизни, а модель Ember.

Кажется, я следовал документации, поскольку она довольно проста, я что-то упускаю здесь?

Способ, которым я настроил mirage, состоит в том, чтобы просто создать фабрику mirage для шаблона и добавить маршруты для него в конфигурации:

// mirage/config.js
this.get('/templates');
this.get('/templates/:id');

// mirage/factories/template.js
import { Factory, faker } from 'ember-cli-mirage';

export default Factory.extend({
    subject: faker.lorem.sentence,
    insertDatetime: faker.date.past,
    body: faker.lorem.paragraphs
});

1 Ответ

0 голосов
/ 05 июля 2018

Нет простого способа получить данные / модели из Mirage прямо в ваше приложение Ember.

Поскольку Mirage был разработан для макетирования уровня вашего сервера, типичный способ передачи данных Mirage в Ember - это когда приложение Ember выполняет запросы Ajax. Это хорошо работает при приемочном тестировании, так как эти тесты запускают ваше полное приложение Ember (которое при производстве будет выполнять сетевые запросы при загрузке данных).

В интеграционных тестах удобно работать с моделями, локальными для вашего приложения Ember, без прохождения сетевого уровня.

Модели Mirage никогда не следует передавать непосредственно в компонент Ember, поскольку они полностью отделены от Ember и его объектной модели. Модели и отношения Mirage предназначены только для работы в своем «поддельном» контексте сервера.

Таким образом, вместо добавления реальных сетевых запросов в ваши интеграционные тесты для извлечения данных Mirage, вы можете создать помощник , который позволит вам server.create данные Mirage, а затем принудительно отправить их в хранилище Ember Data. Затем вы можете использовать store.peekRecord, чтобы взять модели из локального хранилища и передать их в ваши компоненты:

let mockTemplate = server.create('template');
this.pushMirageDbIntoStore();

this.set('mockTemplate', this.store.peekRecord('template', mockTemplate.id));

Я знаю, что это сбивает с толку, и вы, конечно, не первый человек, который спрашивает об этом. Со временем мы добавим что-то вроде этого помощника в Mirage, но пока это лучший подход.

...