【问题标题】:Testing node.js with mocha and chai用 mocha 和 chai 测试 node.js
【发布时间】:2018-02-27 00:10:30
【问题描述】:

我已经成功测试了使用 node.js 构建的 API 端点,但仍然不知道如何测试这种“非异步”代码。

/**
 * 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;

这只是加载我所有 Sequelize 模型(.js 文件)并创建关联的代码的简单部分。

在使用 istanbul、mocha 和 chai 进行测试时,我可以全面覆盖我的 API 函数,但无法覆盖此代码。

我应该如何测试这个?

【问题讨论】:

    标签: node.js mocha.js sequelize.js chai istanbul


    【解决方案1】:

    如果你想使用 fs 测试某些东西,恕我直言,你应该在你的模块中使用依赖注入。这将允许您模拟 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;

    然后你像这样使用你的模块:

    //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)

    这允许你通过一个假的 FS 来使用 mocka 进行测试。

    模拟 fs:https://www.npmjs.com/package/mock-fs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2015-12-01
      • 2013-04-11
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多