2017-06-29 88 views
0

我有一個頁面有多個AJAX調用到服務器。現在,我正在用Mirage嘲笑數據以用於測試目的。爲此,我使用工廠。Ember Mirage模型:對於多個hasMany和belongsTo

我有工廠在頁面呈現過程中使用的所有模型。所有的模型都有很多關係,很少有模型有許多和belongsTo,其他模型有很多單獨的。

我在網上找到了使用這些協會後創建鉤子。

我的疑問是:

在海市蜃樓型號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等?

用幻影來處理這類關係問題的最好方法是什麼?

在此先感謝!

回答

0

根據您在每次測試中的數據需求,您可以使用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,如果你沒有一個作家會作出一個通過。這是有道理的,因爲沒有作者就不能存在帖子。

但是作者可以沒有帖子而存在。在一些測試中,您可能只需要一位作者,並且不想擔心創建帖子。該特性可以讓你一舉兩得:

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

現在你有更多的靈活性,根據測試的需要,你的種子模擬數據庫。

希望有幫助!