【问题标题】:Refactoring mock response in ember cli mirage 0.2.x在 ember cli mirage 0.2.x 中重构模拟响应
【发布时间】:2016-06-27 11:37:22
【问题描述】:

我正在使用 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());
  }); 
});

【问题讨论】:

  • 第二部分你可以直接返回用户,Mirage 会自动通过序列化层:return user; 至于第一部分,Mirage 中的 m2m 关系故事有点缺乏,所以可能你这里的方法是目前最直接的方法。
  • @KoriJohnRoys 谢谢。

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


【解决方案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 关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多