使用 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 对 Relay 容器的集成测试与工作中的 GraphQL 后端不工作
使用 Jest 对 Relay 容器的集成测试与工作中的 GraphQL 后端不工作