当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?
Posted
技术标签:
【中文标题】当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?【英文标题】:Why does my node.js HTTP requests fail when my server is initialized by my test suite?当我的测试套件初始化我的服务器时,为什么我的 node.js HTTP 请求会失败? 【发布时间】:2021-12-29 00:03:26 【问题描述】:我一直在尝试为我的 node.js API 项目编写一个测试套件,他们的要求之一是控制服务器何时启动和停止。为此,我在下面使用两个函数编写了这段代码:initializeWebServer
和 stopWebServer
。
express.js
const initializeWebServer = () =>
return new Promise((resolve, reject) =>
app = express();
/* some middlewares */
app.use('/', userRoutes);
httpServer = http.createServer(app);
httpServer.listen(3000, (err) =>
if (err)
reject(err);
return;
resolve(app);
);
);
;
const stopWebServer = () =>
return new Promise((resolve, reject) =>
httpServer.close(() => resolve(); );
);
;
使用mocha
运行我的测试,我选择使用before
和after
挂钩管理我的服务器连接,使用async/await 语法。
user.spec.js
let axiosAPIClient;
before(async () =>
await initializeWebServer();
const axiosConfig =
baseURL: `http://localhost:3000`,
validateStatus: () => true
;
axiosAPIClient = axios.create(axiosConfig);
);
after(async () =>
await stopWebServer();
);
describe('POST /api/user', () =>
it('when add a new user, then should get back approval with 200 response', async () =>
const userData =
/* user props */
;
const response = await axiosAPIClient.post('/api/user', userData);
expect(response).to.containSubset(
status: 200,
data: message: 'User signed up.'
);
当axios
(我也试过fetch
)提交任何HTTP请求时,mocha
返回以下错误:Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
。我尝试增加超时间隔,但没有奏效。
如果我在没有钩子的情况下执行我的测试套件,使用nodemon
初始化我的服务器,并使用相同的await initializeWebServer();
指向我的索引文件,HTTP 请求就会正常工作。
我真的不明白为什么会这样,我认为是 mocha
的问题。
【问题讨论】:
有没有可能是 http 请求本身永远无法完成? 如果我将--timeout 0
标志放在 mocha 上,它会永远挂起,也会阻止另一个请求。当我开始编写和运行这个测试用例时,axios requests 正在工作。突然,这个错误发生了,我被卡住了。
您的第一步应该是找出它挂在哪里的确切位置。是在考试期间吗?在清理期间? console.log 是一种简单的入门方法(或连接真正的调试器)
【参考方案1】:
我做了一些调试测试,发现我在运行测试套件时忘记设置数据库连接,包括在before
和after
挂钩中。这是一个简单的错误。
user.spec.js
let axiosAPIClient;
before(async () =>
await initializeWebServer();
db.setUp();
/* axios config etc. */
after(async () =>
await stopWebServer();
await db.closeConnection();
);
【讨论】:
删除答案,或更新您的回复,详细说明您如何修复它。以上是关于当我的测试套件初始化我的服务器时,为啥我的 node.js HTTP 请求会失败?的主要内容,如果未能解决你的问题,请参考以下文章
从 maven 执行 Testng 套件文件时,它会被忽略,因此不会调用我的侦听器
为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?
为啥我的添加好友测试路由在 insomina 中通过了 200 OK,但是当我调用获取所有用户时它没有嵌套?