我有一些密码重置功能,我正在重新编写,但添加了测试。
我的测试应该是:
- 在数据库中创建一个用户条目
- 在数据库中为该用户创建一个哈希令牌条目
- 验证哈希令牌是否与数据库中的条目匹配
最后一个(3(,我在测试时遇到了问题,因为通常情况下,我不会在生产中向用户(客户端(返回哈希令牌。相反,我会向我的任务工作者发送一个事件,并在内存中传递哈希令牌字符串,然后向他们发送一封带有秘密链接的电子邮件。
我的验证路线看起来像:
server.get('/api/v1/users/password/reset/:token', userPasswordReset.fetch)
因此,正如您所看到的,我需要从请求参数中获取token
,这意味着我需要以某种方式将其发送回我(但仅在测试环境中,而不是在生产环境中(。
为了解决这个问题,在我的控制器中,我目前正在这样做:
return process.env.NODE_ENV === 'test'
? res.status(201).send({ token: record.token })
: res.status(201).end()
然而,我想知道是否有更安全的方法。我不喜欢在依赖env变量的生产代码中放入脆弱代码的想法。
我曾考虑过将令牌写入系统上的文件,但由于这些测试将在不同的环境中运行,我不确定基于虚拟文件系统的测试是否完全可靠。
您应该只测试您的公共API。您不会测试无效的场景。您可以在DB层测试令牌的哈希创建和存储。希望这能有所帮助。