我正在使用 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());
});
});
最佳答案
如果是多对多,您应该显式创建连接记录,因为尚不存在直接的 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 关系。
关于javascript - 在 ember cli mirage 0.2.x 中重构模拟响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38052967/