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

时间:2017-06-29 16:59:55

标签: javascript ember.js ember-data ember-cli-mirage

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

我在页面渲染过程中使用了所有模型的工厂。所有模型都有很多关系,很少有模型有hasMany和belongsTo,其他模型都有很多个人。

我在网上遇到了使用aftercreate hook进行这种关联。

我怀疑是:

海市蜃楼中的模特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之后等等​​吗?

用海市蜃楼处理这类关系问题的最佳方法是什么?

提前致谢!

1 个答案:

答案 0 :(得分: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,如果你没有传入作者,它就会创建一个。{1}}。这是有道理的,因为没有作者就不能存在帖子。

但作者可以在没有帖子的情况下存在。在某些测试中,您可能只需要一位作者,也不想担心创建帖子。这个特性可以让你做到这两点:

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

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

希望有所帮助!