我正在使用ember cli mirage为我的Ember应用程序编写一些验收测试。我成功地模拟了服务器响应登录,但我不高兴我是怎么做到的。 Ember cli mirage有路由处理程序的缩写,我想使用它们,但我尝试的一切都会给我一个错误(除了这个解决方案)。有人可以帮我重构这个回复吗?
this.post('/login', ({ users, resources })=> {
let user = users.first();
if(!Ember.isEmpty(resources.first())){
return {
data: {
type: 'user',
id: user.id,
attributes: user,
relationships: {
resources: {
data: [
{ id: resources.first().id, type: 'resource' }
]
}
}
},
};
} else {
return {
data: {
type: 'user',
id: user.id,
attributes: user
}
};
}
});
我有用户和资源模型以及工厂定义,在用户和资源模型中它们之间存在关系(它是多对多的关系)。以下是我在测试中创建用户的方法
test('User can login', function(assert){
let resources = server.createList('resource', 2),
user = server.create('user', {resources: resources});
loginUser(user.email);
andThen(()=>{
assert.ok(find('a:contains("Logout")'));
assert.equal('resource.content', currentPath());
});
});
答案 0 :(得分:1)
如果是多对多,则应明确创建连接记录,因为直接的m2m关系支持尚不存在。
// mirage/models/user.js
import { Model, hasMany } from 'ember-cli-mirage';
export default Model.extend({
userResources: hasMany()
});
// mirage/models/resource.js
import { Model, hasMany } from 'ember-cli-mirage';
export default Model.extend({
userResources: hasMany()
});
// mirage/models/user-resource.js
import { Model, belongsTo } from 'ember-cli-mirage';
export default Model.extend({
user: belongsTo(),
resource: belongsTo()
});
test('User can login', function(assert){
let user = server.create('user');
let resources = server.createList('resource', 2),
// create the join records
resources.forEach(resource => {
server.create('user-resource', { user, resource });
});
loginUser(user.email);
andThen(() => {
assert.ok(find('a:contains("Logout")'));
assert.equal('resource.content', currentPath());
});
});
如果您需要模拟直接暴露m2m的端点,则需要更多工作。但总的来说,我发现如果你的Ember应用程序暴露了关系的CRUD操作,那么公开连接记录也是好的。使事情变得更简单。
话虽这么说,Mirage最终将支持m2m关系。