【问题标题】:Wait for routes and database to initialize before running Mocha tests在运行 Mocha 测试之前等待路由和数据库初始化
【发布时间】:2018-11-17 20:03:21
【问题描述】:

我有一个 NodeJS 应用程序,它连接到 Mongo 数据库,然后在建立连接后初始化所有路由。我想添加一些使用服务器的 Mocha 测试和 supertest 用于测试请求。但是,要从test.js 文件中检索服务器,我需要require() 主文件并从中获取服务器变量。但是,当我尝试使用它时,它会抱怨该变量未定义,因为尚未加载数据库并且尚未初始化路由。

main.js (extract)

// This is a custom mongo module that connects using my db string
// It stores the DB as a variable in another file, which is later retrieved by the route handlers using mongo.GetDB()

mongo.ConnectToDB(function(err, dbo){
    if(err) throw err;

    require("./api")(app);
    require("./admin")(app);
    require("./routes")(app);
});

// This obviously doesn't work, as it's outside of the callback
module.exports.server = app.listen(4500);

server.test.js (extract)

describe("loading express", (done) => {
    let server;
    beforeEach(() => {
        // The server is returned, but none of the routes are included
        server = require("../main").server;
    });

    afterEach(() => {
        server.close();
    });

    // ...
});

有什么方法可以等待数据库和路由初始化server 变量被检索并且Mocha 测试继续?

【问题讨论】:

  • 我怎么没想到!谢谢你的帮助,我会看看我能做些什么。
  • 您能否将其添加为答案,以便我可以将其标记为已回答@CertainPerformance

标签: javascript node.js express callback mocha.js


【解决方案1】:

main.js 导出一个Promise,例如:

module.exports.serverPromise = new Promise((resolve, reject) => {
  mongo.ConnectToDB(function(err, dbo){
    if(err) reject(err);
    require("./api")(app);
    require("./admin")(app);
    require("./routes")(app);

    resolve(app.listen(4500));
  });
});

然后,导入之后,在Promise上调用.then就可以使用了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2019-11-03
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多