2016-12-03 4 views
0

Ich versuche, meine Passwort-Hashing-Funktion zu testen, aber ich bekomme weiterhin Fehler aufgrund einiger TypeError Fehler.Mocha werfen Fehler beim Testen node.crypto Funktionen

Ich bin sicher, dass die Funktion funktioniert, seit ich versuchte, es aus einer anderen Datei aufzurufen, und ich bekomme das erwartete Ergebnis ohne Fehler. Hier

ist die Funktion:

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); 
      }); 
     }); 
     }); 
    }; 

Hier ist der Test, der fehlschlägt:

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); 
      }); 
     }); 
     }); 
    }); 

Und das ist der 'Fehler':

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) 

Hat jemand eine Ahnung, warum ?

Ich verwende mocha mit should und Entwicklung auf node.

+0

Es ist nicht klar ist, welche die Funktion der Fehler zu werfen ist. Könnten Sie das klären? – pietrovismara

+0

Natürlich gibt es nur eine Funktion 'hashPassword()', die sich in einer Datei namens 'utils.js' befindet. Wenn Sie nun fragen, wo der Fehler bei 'at Promise (api \ paths \ users \ utils.js: 24: 12) liegt, dann ist dies die erste Verwendung von crypto' crypto.randomBytes' – Johnny

+1

Nun, ich denke, Sie haben bereits überprüft die Größe, die Sie übergeben, um crypto.randomBytes gleich oder größer als 0 zu sein? – pietrovismara

Antwort

1

Dank pietrovismara, die mich auf die Lösung hingewiesen.

Das Problem war, dass salt_length eine Zeichenfolge und keine Nummer war. Ich habe die Argumente ausdrucken und ich konnte sehen, dass sie ‚richtig‘, aber offensichtlich nicht der richtige Typ waren (daher Typeerror, ich denke ...)

Ich halte das Argument in einer .env Datei und ich las sie bei der Verwendung der dotenv Paket, das sie offensichtlich als einfache Zeichenfolgen liest (wie es sollte) ... der Grund, warum es funktionierte, als ich die Funktion aus einer anderen Datei 'prüfte' war, dass ich in diesem Fall nicht die Argumente aus .env, I haben so etwas wie:

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

Mokka wurde Correclty .env Werte (Strings) verwenden, aber wenn täuscht ein Runde mit der Datei habe ich diese Umgebungsvariablen nicht geladen.

Ich habe heute etwas gelernt, das heißt, ich sollte nach Hause gehen, wenn ich müde bin, anstatt aufladen und Dinge nicht vor meinen Augen sehen.

Da auch mocha Versprechen unterstützt, der ‚richtige‘ sollte Testfall sein (mit should):

describe('users',() => { 

    describe('utils',() => { 

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

    }); 
    }); 
+1

Du könntest sogar das '.catch()' entfernen und Mocha es für dich behandeln lassen. – robertklep

+1

@robertklep sehe meinen bearbeiteten Code;) – Johnny