Ember Mirage 模型:对于多个 hasMany 和 belongsTo

Posted

技术标签:

【中文标题】Ember Mirage 模型:对于多个 hasMany 和 belongsTo【英文标题】:Ember Mirage Model : For multiple hasMany and belongsTo 【发布时间】:2017-06-29 16:59:54 【问题描述】:

我有一个对服务器有多个 AJAX 调用的页面。现在,我正在使用 Mirage 模拟数据以进行测试。为此,我使用的是工厂。

我为页面渲染期间使用的所有模型提供了工厂。所有模型都有很多关系,很少有模型有 hasMany 和 belongsTo,其他模型只有 hasMany。

我在网上偶然发现使用 aftercreate 钩子来进行此类关联。

我的疑问是:

海市蜃楼中的模型 author.js 有:

author: hasMany('post'),
afterCreate(a, server) 
   server.create('b', a);

同样,海市蜃楼中的模型 post.js 有:

author: belongsTo(),
aftercreate(b, server) 
   server.create('a', post);

我的疑问是,这不是递归调用吗,在每个 afterCreate 钩子之后,另一个模型被实例化,并同时调用另一个 afterCreate 等等?

用 mirage 处理这类关系问题的最佳方法是什么?

提前致谢!

【问题讨论】:

【参考方案1】:

根据您在每次测试中的数据需求,您可以在此处使用traits 为您提供更多控制。这是您可以做到的一种方法:

// factories/author.js
import  Factory, trait  from 'ember-cli-mirage';

export default Factory.extend(

  name: 'Author name',

  withPosts: trait(

    afterCreate(author, server) 
      server.createList('post', 3,  author );
    

  )

);

// factories/post.js
import  Factory, trait  from 'ember-cli-mirage';

export default Factory.extend(

  title: 'My first blog post',

  afterCreate(post, server) 
    if (!post.author) 
      server.create('author',  posts: [ post ] );
    
  

);

这基本上是说,任何时候你创建一个post,如果你没有传入作者,它就会创建一个。这是有道理的,因为没有作者,帖子就无法存在。

但作者可以在没有帖子的情况下存在。在某些测试中,您可能只需要一个作者,并且也不想担心创建帖子。该 trait 让你两者兼得:

server.create('author'); // just an author
server.create('author', 'withPosts'); // an author with posts

现在您可以更灵活地根据测试需要为模拟数据库播种。

希望有帮助!

【讨论】:

以上是关于Ember Mirage 模型:对于多个 hasMany 和 belongsTo的主要内容,如果未能解决你的问题,请参考以下文章

Ember Mirage 没有将模型作为 ember 对象传递

Ember 数据模型中的计算属性不适用于 ember-cli-mirage 模型

当模型被侧载时,ember-cli-mirage 失去关系

在 ember-cli-mirage 中引入瞬时延迟

来自 Mirage 的 Ember 数据无法在 index.hbs 上显示

使用 Postman 进行 Ember Mirage Fake API 测试