使用 Jest、Graphql 和 Sequelize 测试数据库时如何避免 EADDRINUSE

Posted

技术标签:

【中文标题】使用 Jest、Graphql 和 Sequelize 测试数据库时如何避免 EADDRINUSE【英文标题】:How to avoid EADDRINUSE when testing a database with Jest, Graphql and Sequelize 【发布时间】:2018-07-04 16:59:35 【问题描述】:

我正在尝试使用 Jest 和 Sequelize 测试模拟数据库。我创建了这个辅助函数,它在每个测试套件之前运行:

export function handleTestDatabase() 
  beforeAll(() => 
    testDatabase.sequelize.sync().then(() => app.listen(0));
  );
  afterAll(() => testDatabase.sequelize.close());

我在这里创建到我的测试数据库的连接,并希望服务器监听任何端口。我没有给出具体的原因是我遇到了这些错误:

listen EADDRINUSE :::4001

帮助函数是为了解决这个问题而编写的,但它不起作用。有没有办法按顺序运行所有测试?因为单独运行时,每个测试套件都会成功完成。我已经尝试过这个命令,但它不起作用:

jest --runInBand

更困扰我的是测试似乎忽略了我的 beforeAll 函数,因为我也收到了这个错误:

听 EADDRINUSE :::4001

  193 |
  194 | _models2.default.sequelize.sync().then(function () 
> 195 |   return server.listen(PORT, function () 
  196 |     if (process.env.LOGGING) 
  197 |       console.log("Server running on port " + PORT);
  198 |       console.log("Go to http" + secure + "://localhost:" + PORT + "/graphiql for the Interface");

  at dist/index.js:195:17
  at tryCatcher (node_modules/bluebird/js/release/util.js:16:23)
  at Promise._settlePromiseFromHandler (node_modules/bluebird/js/release/promise.js:512:31)
  at Promise._settlePromise (node_modules/bluebird/js/release/promise.js:569:18)
  at Promise._settlePromise0 (node_modules/bluebird/js/release/promise.js:614:10)

这不应该发生,因为这是来自我的 index.js 文件,并且在测试时不应该到达,因为我的测试命令是:

"test": "ENVIRONMENT=testing jest --verbose",

我用这个子句“保护”我的应用程序:

if (ENVIRONMENT != "testing") 
  models.sequelize
    .sync()
    .then(() =>
      server.listen(PORT, () => 
        if (process.env.LOGGING) 
          console.log(`Server running on port $PORT`);
          console.log(
            `Go to http$secure://localhost:$PORT/graphiql for the Interface`
          );
        
      )
    .catch(err => 
      console.log(err);
      server.close();
    );

我还尝试通过编写递归侦听函数来修复它,如果出现错误,它将使用另一个端口重新打开应用程序,但这也不起作用。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我通过使用globalSetup 并在那里创建服务器解决了这个问题。

【讨论】:

谢谢。我会调查的。

以上是关于使用 Jest、Graphql 和 Sequelize 测试数据库时如何避免 EADDRINUSE的主要内容,如果未能解决你的问题,请参考以下文章

用 Jest 测试 GraphQL 解析器

使用 Jest 对 Relay 容器的集成测试与工作中的 GraphQL 后端不工作

使用 Jest 对 Relay 容器的集成测试与工作中的 GraphQL 后端不工作

无法在 jest vue 中导入 graphql 查询文件

如何在 jest / apollo 客户端中捕获被拒绝的 graphql 订阅?

如何在 TypeScript 中使用 Jest 和 Knex 进行测试?