灰烬幻影未通过模型作为余烬对象

时间:2018-07-05 13:52:59

标签: ember.js ember-cli-mirage

使用最新的Ember(3.2),ember-cli-mirage 0.4.7,ember-cli-qunit 4.3.2,ember-qunit 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);
        }
    }
});

看来,海市model楼模型不是我的现实生活代码所期望的对象,而是Ember模型。

到目前为止,我似乎已经遵循了文档,因为这是非常基本的,这里我缺少什么吗?

我设置海市rage楼的方法只是为模板创建海市factory楼工厂,并在配置中为其添加路由:

// 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 :(得分:5)

没有简单的方法可以将Mirage中的数据/模型直接导入到Ember应用中。

由于Mirage旨在模拟您的服务器层,因此将Mirage数据导入Ember的典型方式是当Ember应用程序发出Ajax请求时。这在验收测试中效果很好,因为这些测试会执行您完整的Ember应用程序(生产中的应用程序将在加载数据时发出网络请求)。

在集成测试中,可以轻松使用Ember应用程序本地模型,而无需通过网络层。

幻影模型永远不要直接传递到Ember组件中,因为它们与Ember及其对象模型完全分开。 Mirage的模型和关系仅设计为在其自己的“伪”服务器上下文中工作。

因此,您可以创建a helper,让您server.create进行Mirage数据,然后将其推入Ember Data的存储中,而不是向集成测试中添加实际的网络请求以获取Mirage数据。然后,您可以使用store.peekRecord从本地商店中获取模型并将其传递到您的组件中:

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

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

我知道这很令人困惑,您当然不是第一个询问此事的人。我们最终将在Mirage中添加类似此帮助器的内容,但目前这是最好的方法。