首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未将模型作为成员对象传递的成员幻影

未将模型作为成员对象传递的成员幻影
EN

Stack Overflow用户
提问于 2018-07-05 13:52:59
回答 1查看 1K关注 0票数 3

使用最新的Ember (3.2),成员-cli-海市蜃楼0.4.7,成员-cli-q单元4.3.2,成员-q单元3.4.1

我正在使用成员-cli-海市蜃楼来尝试前端测试,我无法绕过这个错误:

代码语言:javascript
复制
Uncaught TypeError: template.getProperties is not a function

我在组件测试中运行这个程序:

代码语言:javascript
复制
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文件的相关部分是:

代码语言:javascript
复制
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模型。

我似乎已经跟踪了文档,因为这是非常基本的,这里有什么我缺少的东西吗?

设置海市蜃楼的方法是为模板创建一个海市蜃楼工厂,并在配置中为其添加路由:

代码语言:javascript
复制
// 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
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-05 16:27:33

没有一种简单的方法可以从幻影中直接获取数据/模型到你的Ember应用。

因为幻影是为模拟服务器层而设计的,所以将幻影数据输入Ember的典型方法是当Ember应用程序发出Ajax请求时。这在验收测试中工作得很好,因为这些测试会执行完整的Ember应用程序(在生产中会在加载数据时发出网络请求)。

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

幻影模型不应直接传递到Ember组件中,因为它们与Ember及其对象模型完全分离。幻影的模型和关系只在它自己的“假”服务器上下文中工作。

因此,不需要在集成测试中添加实际的网络请求来获取幻影数据,您可以创建帮手,使您可以使用server.create幻影数据,然后强制将其推入Ember数据存储区。然后,您可以使用store.peekRecord从本地商店获取模型并将它们传递到您的组件中:

代码语言:javascript
复制
let mockTemplate = server.create('template');
this.pushMirageDbIntoStore();

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

我知道这让人困惑,你当然不是第一个问这个问题的人。我们最终会在幻影中添加类似这个助手的东西,但就目前而言,这是最好的方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51193119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档