2017-09-18 8 views
0

J'ai testé avec succès mon point de terminaison API construit avec node.js mais je n'arrive toujours pas à déterminer comment tester ce type de code "non asynchrone".Test de node.js avec mocha et chai

/** 
* Database service 
*/ 
// Dependencies 
const fs = require('fs'); 
const path = require('path'); 
const Sequelize = require('sequelize'); 
const basename = path.basename(module.filename); 
let db = {}; 

// Connection 
let sequelize = new Sequelize(process.env.DATABASE_URL, {logging: false}); 

// Models processing 
fs 
    .readdirSync(__dirname) 
    .filter(file => 
     (file.indexOf('.') !== 0) && 
     (file !== basename) && 
     (file.slice(-3) === '.js')) 
    .forEach(file => { 
     /* uncovered */ const model = sequelize.import(path.join(__dirname, file)); 
     /* uncovered */ db[model.name] = model; 
    }); 

Object.keys(db).forEach(modelName => { 
    /* uncovered */ if (db[modelName].associate) { 
    /* uncovered */  db[modelName].associate(db); 
    /* uncovered */ } 
}); 

db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

// Export everything 
module.exports = db; 

Ceci est juste une simple partie de code qui charge tous mes modèles Sequelize (.js) et créer les associations. Pendant les tests avec istanbul, moka et chai, je peux obtenir une couverture complète sur mes fonctions API, mais je ne peux pas obtenir ce code couvert.

Comment dois-je tester cela?

Répondre

0

Si vous voulez tester quelque chose en utilisant le fs, à mon humble avis, vous devriez utiliser l'injection de dépendance dans votre module. Cela vous aloow à se moquer de la fs:

/** 
 
* Database service 
 
*/ 
 
// Dependencies 
 

 
const Sequelize = require('sequelize'); 
 

 
makeDb = (fs, path) => { 
 
     let db = {} 
 
     const basename = path.basename(module.filename); 
 
     // Connection 
 
     let sequelize = new Sequelize(process.env.DATABASE_URL, { logging: false }); 
 

 
     // Models processing 
 
     fs 
 
      .readdirSync(__dirname) 
 
      .filter(file => 
 
       (file.indexOf('.') !== 0) && 
 
       (file !== basename) && 
 
       (file.slice(-3) === '.js')) 
 
      .forEach(file => { 
 
       /* uncovered */ 
 
       const model = sequelize.import(path.join(__dirname, file)); 
 
       /* uncovered */ 
 
       db[model.name] = model; 
 
      }); 
 

 
     Object.keys(db).forEach(modelName => { 
 
      /* uncovered */ 
 
      if (db[modelName].associate) { 
 
       /* uncovered */ 
 
       db[modelName].associate(db); 
 
       /* uncovered */ 
 
      } 
 
     }); 
 

 
     db.sequelize = sequelize; 
 
     db.Sequelize = Sequelize; 
 
     return db 
 
    } 
 
    // Export everything 
 
module.exports = makeDb;

Ensuite, vous utilisez votre module comme ceci:

//app.js 
 
const fs = require('fs') 
 
const makeDb = require("./db") 
 
const db = makeDb(fs, path) 
 
    /* 
 
    * DO SOME STUFF 
 
    */ 
 

 
//db.test.js 
 
const fakeFs = require('mock-fs') 
 
const makeDb = require("./db") 
 
const testDb = makeDb(fakeFs, path)

Cela vous permet de passer un faux FS pour faire tes tests avec Mocka.

Mock-fs: https://www.npmjs.com/package/mock-fs