2015-08-26 136 views
1

我有一些簡單的基於Promise的代碼,儘管我嘗試了最好的時間(> 2000ms)。幫幫我?節點/摩卡測試超時

export function listCurrentUserPermissions(req, res, next) { 
    return UserPermission.findAll({ 
    where: { accountId: req.user.tenant() } 
    }).catch((error) => { 
    console.log('-----------------------------------'); 
    console.log(error); 
    console.log.bind(console); 
    console.log('-----------------------------------'); 
    }).then((permissions) => { 
    return res.json({ userPermission: permissions.map(serializeUserPermission) }); 
    }, next); 

而且測試:

describe('GET /api/v0/permissions',() => { 
    it('shows the current users permissions',() => { 
     return api.listCurrentUserPermissions(req, res, next).then(() => { 
     expect(UserPermission.findAll).to.have.been.calledWithMatch({ 
      where: { accountId: req.user.tenant() } 
     }); 

     expect(next).to.have.beenCalled; 
     expect(next.lastCall.args[0].output.payload.statusCode).to.equal(200); 
     expect(next.lastCall.args[0].output.payload.permission).to.include(nonAdminPermission.permission); 
     }); 
    }); 
    }) 

的錯誤,我得到:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

console.log不會被調用,但我可以證實,該代碼被稱爲與適當的參數,可以等。

回答

0

它看起來像next繼續被傳遞爲錯誤處理程序(第二個參數)爲then方法。

我想你想:

export function listCurrentUserPermissions(req, res, next) { 
    return UserPermission.findAll({ 
    where: { accountId: req.user.tenant() } 
    }).catch((error) => { 
    console.log('-----------------------------------'); 
    console.log(error); 
    console.log.bind(console); 
    console.log('-----------------------------------'); 
    }).then((permissions) => { 
    return res.json({ userPermission: permissions.map(serializeUserPermission) }); 
    }).then(next); 
+0

不幸的是這種重構:( –

+0

哦發生同樣的錯誤,woops不能通過'next'作爲成功回調,因爲它的節點式的(錯誤結果) (()=> {next()})' – jasonkarns

+0

雖然你通常不需要調用'next',因爲這條路線是最後一行(它發送一個響應),不需要調用後續的中間件,所以我通常在promise上調用'.done'。 – jasonkarns