我正在尝试测试我的密码散列函数,但由于某些TypeError错误而继续失败。
我确信该功能有效,因为我试图从其他文件中调用它,我得到了预期的结果而没有任何错误。
这是功能:
exports.hashPassword = (password) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(salt_length, (err, buf) => {
if (err) reject(err);
const salt = buf.toString('base64');
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
if (err) reject(err);
const hashedPassword = '{X-PBKDF2}:'+digest+':'+keylenB64+':'+iterationsB64+':'+salt+':'+key.toString('base64');
resolve(hashedPassword);
});
});
});
};
以下测试失败:
describe('users', () => {
describe('utils', () => {
it('should hash a password', (done) => {
const password = 'secret';
utils.hashPassword('secret')
.then((hash) => {
console.log('Hash: '+ hash);
done();
})
.catch((err) => {
console.log(err);
done(err);
});
});
});
});
这就是'错误':
1 failing
1) users utils should hash a password:
TypeError: size must be a number >= 0
at Promise (api\paths\users\utils.js:24:12)
at Object.exports.hashPassword (api\paths\users\utils.js:14:10)
at Context.it (api\paths\users\utils.test.js:30:13)
有谁知道为什么?
我正在mocha
使用should
并在node
上进行开发。
答案 0 :(得分:1)
感谢pietrovismara指出我的解决方案。
问题是salt_length
是一个字符串而不是数字。我正在打印参数,我可以看到它们是“正确的”但显然不是正确的类型(因此TypeError,我猜...)
我将参数保存在.env
文件中,然后使用dotenv
包读取它们,这显然将它们视为简单的字符串(应该如此)...它之所以工作的原因是什么我正在“测试”另一个文件中的函数是在那个实例中我没有使用从.env
读取的参数,我有类似的东西:
const salt_length = process.env.SALT_LENGTH || 128;
Mocha使用.env
值(字符串)是正确的,但在使用该文件时,我没有加载那些环境变量。
我今天学到了一些东西,那就是我累了就应该回家而不是充电,而不是在我眼前看东西。
此外,由于mocha
支持承诺,因此“正确”的测试用例应为(使用should
):
describe('users', () => {
describe('utils', () => {
it('should hash a password', () => {
return utils.hashPassword('secret').should.be.fulfilled();
});
});
});