2017-04-17 184 views
0

目前节能与猫鼬数组类型的猫鼬模式阵列,我没有通过测试摩卡/柴:如何测试对象

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); 
}); 

实际阵列具有插入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 } 
    ] 

有什么办法通过测试? 感谢反馈

回答

1

首先,你需要包括一个.deep因为你比较数组对象的,(如果不包括.deep,柴只会比较使用===两个对象,这将永远是正确的)。

但即便如此,我不认为你可以让柴无视额外的_id。相反,我可能会将测试分为两部分:首先检查res.body.permissions中的项是否具有_id属性,然后将其删除并最终与resourcePublic进行深层比较。

所以:

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); 

顺便说一句,因为你使用基于承诺码,我会建议服用摩卡的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 
     ... 
    }); 
}); 
+0

非常感谢小费...了解了它! – erwin