前もってお詫び申し上げます: 私は Ember (2.2.0) と Mirage の両方に不慣れで、既存の Ember アプリケーションの受け入れテストを作成する任務を負っています。私の課題は、Mirage (0.1.13) とフィクスチャ (ファクトリではない) を使用して、データ内の既存の 1 対多または多対多の関係を模倣することです。重要な関係をモデル化する完全な例は見つかりませんでした。
次の単純な多対多の関係を考えてみましょう。ユーザーは複数のロールを持つことができます。
それぞれの Ember モデルは次のとおりです。
// models/user.js
import Ember from "ember";
import DS from 'ember-data';
export default DS.Model.extend({
email: DS.attr('string'),
//unidirectional M-M
roles: DS.hasMany('user-role', {inverse: null})
});
// models/user-role.js
import DS from 'ember-data';
export default DS.Model.extend({
description: DS.attr('string')
});
user-role
ハイフンで囲まれていることに注意してください 。
フィクスチャを作成する私の試み:
// mirage/fixtures/users.js
export default [
{id: 1, email: 'user@email.com', roles: {userRole_ids: [1]}},
{id: 2, email: 'supervisor@email.com', roles: {userRole_ids: [1, 2]}}
];
// mirage/fixtures/userRoles.js
export default [
{id: 1, description: 'regular user'},
{id: 2, description: 'supervisor'}
];
//mirage/config.js
export default function() {
//...
//single user data
this.get('/users/:id', function(db, request) {
let id = request.params.id;
return db.users.find(id);
});
//...
}
にブレークポイントを配置する finders.js
と
var payload = normalizeResponseHelper(serializer, store, typeClass, adapterPayload, id, 'findRecord');
I seeの値を調べ adapterPayload
ます。たとえば、
email: "supervisor@email.com"
id: 2
roles: Array[2]
0: Object:
userRole_id: 1
1: Object:
userRole_id: 2
予想の代わりに
email: "supervisor@email.com"
id: 2
roles: Array[2]
0: Object
id: 1
description: "regular user"
1: Object
id: 2
description: "supervisor"
つまり、ユーザー ロール ID の外部キーは、Mirage によって対応するレコードに解決されません。ユーザーロールのハイフネーションがファイルの名前と一致しないことに関係があると思われ userRoles.js
ます。
バックエンド機能 (私がモックしようとしている) は、以下に示す JAX-RS JPA と Spring Framework を使用して実装されています。
// User.java
//...
@Entity
@Table(name = "User")
public class User extends BaseBizObj<User, SimplePrimaryKey<String>, UserRepository> {
//...
@ManyToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "Roles")
@NotNull
@JsonProperty
private Set<UserRole> roles;
//...
}
// UserRole.java
//...
@Entity
@Table(name = "UserRole")
public class User extends BaseBizObj<User, SimplePrimaryKey<String>, UserRoleRepository> {
//...
@Column(name = "Description")
@NotNull
@JsonProperty
private String description;
//...
}
どんな助けでも大歓迎です。