2017-04-17 89 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