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);
});
ACTUAL 数组在保存文档后插入了 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
...
});
});
目前正在用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);
});
ACTUAL 数组在保存文档后插入了 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
...
});
});