测试node.crypto函数时摩卡抛出错误

时间:2016-12-03 17:25:18

标签: javascript node.js mocha bdd

我正在尝试测试我的密码散列函数,但由于某些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上进行开发。

1 个答案:

答案 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();
      });

    });
  });