Mocha/Chai: 如何测试 Mongoose Schema 对象数组

Mocha/Chai: how to test Mongoose Schema Arrays of objects

目前正在用Mongoose保存一个Array类型,我没有通过测试

let resourcePublic = {
  name: 'RS123',
  description: 'RS123Description',
  owner: newUser.id,
  permissions: [{ level: 'group', level_id: newGroup.id, canWrite: true }],
  private: false
};

it('should create a new public resource', (done) => {
  request(app)
    .post('/api/v1/resources')
    .send(resourcePublic)
    .expect(httpStatus.OK)
    .then((res) => {
      ...
      expect(res.body.permissions).to.have.same.members(resourcePublic.permissions);
      ...
      resourcePublic = res.body;
      done();
    })
    .catch(done);
});

A​​CTUAL 数组在保存文档后插入了 object_id 字段.. 预期没有

  ACTUAL
  res.body.permissions:  [ 
      { level: 'group',
      level_id: '58f4b9c7110e5e7abd4f0425',
      _id: '58f4b9cb110e5e7abd4f042d',
      canWrite: true } 
  ]
  EXPECTED
  resourcePublic.permissions:  [
  { level: 'group',
      level_id: '58f4b9c7110e5e7abd4f0425',
      canWrite: true }
  ]

有什么方法可以过关吗? 感谢反馈

首先,您需要包含一个 .deep,因为您正在比较对象数组(如果您不包含 .deep,Chai 将只使用 === 这永远不会是真的)。​​

但即便如此,我认为您无法让 Chai 忽略额外的 _id。相反,我可能会将测试分为两部分:首先检查 res.body.permissions 中的项目是否具有 _id 属性,然后将其删除,最后与 [=18= 进行深度比较].

所以:

res.body.permissions.permissions.forEach(item => {
  expect(item).to.have.property('_id');
  delete item._id;
});
expect(res.body.permissions).to.deep.have.same.members(resourcePublic.permissions);

顺便说一句,由于您使用的是基于承诺的代码,我建议您利用 Mocha 的 built-in promise support。您的测试将需要(一点)更少的代码,并且它可以帮助您在混合回调和承诺时防止某些问题:

it('should create a new public resource', () => {
  return request(app)
    .post('/api/v1/resources')
    .send(resourcePublic)
    .expect(httpStatus.OK)
    .then((res) => {
      ...
      // assertions here
      ...
    });
});