2016-12-03 67 views
0

我想測試我的密碼哈希函數,但由於某些TypeError錯誤,我一直在獲取失敗。摩卡在測試node.crypto函數時拋出錯誤

我相信,因爲我試圖從一些其他的文件稱之爲功能工作,我得到預期的結果沒有任何錯誤。

下面是函數:

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) 

有任何人任何想法,爲什麼?

我使用mochashouldnode發展。

+0

目前還不清楚這是投擲錯誤的功能。你能澄清嗎? – pietrovismara

+0

當然,只有一個函數hashPassword()駐留在一個名爲utils.js的文件中。現在,如果你問在'Promise(api \ paths \ users \ utils.js:24:12)'錯誤指向哪裏,那麼這是第一次使用加密'crypto.randomBytes' – Johnny

+1

嗯,我想你已經已經檢查你傳遞給crypto.randomBytes的大小是否等於或大於0? – pietrovismara

回答

1

由於pietrovismara是指出我朝着解決方案。

的問題是,salt_length是一個字符串,而不是一個數字。我打印出來的論點,我可以看到他們是'正確的',但顯然不是正確的類型(因此TypeError,我猜...)

我保留在.env文件中的參數,我用dotenv包顯然讀取它們作爲簡單的字符串(因爲它應該)...當我從另一個文件'測試'功能時,它工作的原因是,在那種情況下,我沒有使用從.env讀取的參數,I碰到這樣的:

const salt_length = process.env.SALT_LENGTH || 128;

摩卡是correclty使用.env值(字符串),但愚弄時圍繞文件我沒有加載這些環境變量。

我今天學到了一些東西,這是我應該回家累了,而不是充電並沒有看到我眼前的事情時。

另外,由於mocha支持用,「正確的」測試案例應該是(使用should):

describe('users',() => { 

    describe('utils',() => { 

     it('should hash a password',() => { 
     return utils.hashPassword('secret').should.be.fulfilled(); 
     }); 

    }); 
    }); 
+1

您甚至可以刪除'.catch()'並讓Mocha爲您處理它。 – robertklep

+1

@robertklep看到我編輯的代碼;) – Johnny