unit testing中的护照JWT授权 – 套接字挂断

我有一个情绪化的时间试图testing受保护的路线,使用护照的智威汤逊策略,授权标题。

我试过axios,supertest,superagent和我得到同样的错误 – '套接字挂断':

Error: socket hang up at createHangUpError (_http_client.js:253:15) at Socket.socketOnEnd (_http_client.js:345:23) at emitNone (events.js:91:20) at Socket.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickDomainCallback (internal/process/next_tick.js:122:9) code: 'ECONNRESET', response: undefined } 

这在开发环境中完美地工作,这只发生在testing环境 – unit testing或开发指向testing数据库/用户。

我知道这个错误意味着连接被服务器崩溃或语法错误所closures,但是没有语法错误。 terminal不能通过护照authentication:

passport.authenticate('jwt'...

为什么? 这怎么解决?

终点:

 router.route('/private') .get( passport.authenticate('jwt', { session: false }), (req, res, next) => { res.json({ allTheThings: true }); }) 

考试:

 describe('GET /api/private', () => { it('should work', () => { const USER_JWT_VALID = 'JWT asdf.....'; let instance = axios.create(); instance.defaults.headers.common['Authorization'] = USER_JWT_VALID; return instance.get('http://localhost:3000/api/private') .then((response) => { expect(response.data).to.be.an('object'); // response.data undefined }).catch((error) => { console.log('err ', error); //socket hang up }); }); }); 

如果我删除passport.authenticate并发送一个JSON响应,它按预期工作。

日志显示请求在授权标头中使用正确的JWT发送。

RE评论

我有一个不同的DB /用户开发和testing。 在开发中使用testing数据库,我能够复制在unit testing中看到的问题。 如果我排除一个授权标题,正如所料,我得到一个“未经授权”的响应(从一个令牌检查function)。

只要我添加授权标题JWT,我没有得到任何答复:(

进一步debugging

看起来我的api在testing环境中不再能够做任何GET请求,如果有授权头的话。 没有标题,一切正常。 我怀疑这是与最近的一些依赖关系更新。

在为testing环境创build一个全新的用户并在unit testing中使用它之后,一切都按预期工作。 与授权头中的用户JWT的GET请求完美地工作。

似乎在testing环境(来自mongo db)用于身份validation的用户使用了无效的JWT。 也许是基于用户架构来构buildJWT的方式。

我不知道为什么或如何发生(早期build造阶段)。 现在无法复制。

我的unit testing正在执行以下操作:

1)POST到身份validation端点以获取JWT令牌(来自用户电子邮件和密码)

2)使用该JWT获取仅私有authentication端点。

在私人的GET, passport.authenticate('jwt' ....根本就没有工作,因此,没有要求或回应。

除了无效的智威汤逊之外,我看不到任何其他的原因。

我从中了解到,如果你的unit testing失败了,那就排除旧的/新的用户,并从中解决问题。