hapi/lab及jest测试框架是否支持将describe块放置在独立JS文件中
hapi/lab 抽离公共测试块方案解答
你的实现方案完全可行,这是 @hapi/lab 框架下复用测试逻辑的常规操作,只需要注意几个细节就能正常运行:
- 独立文件需要把封装的
externalDescribe函数导出,主测试文件导入后直接调用即可,lab 的describe支持在任意同步上下文中声明,不需要等待异步执行完成后再定义 - 传入的参数如果包含已经初始化完成的 hapi server 实例、预置测试数据等上下文信息,要确保这些参数在调用
externalDescribe时已经完成初始化,你可以把初始化逻辑放在父级的before钩子中即可 - 注意 lab 不支持为
describe的回调添加async修饰符,你示例代码里的异步声明是无效的,建议去掉避免不必要的报错
下面是补全后的可运行代码示例:
1. 独立公共测试文件 externalFile.test.js
const { describe, it } = require('@hapi/lab').script(); module.exports = function externalDescribe(params) { // 去掉describe回调的async修饰 describe('external', () => { it('first it', async () => { // 直接使用传入的server实例做注入测试 const res = await params.server.inject({ method: 'GET', url: '/your-test-api' }); // 你的断言逻辑 }); }); };
2. 主测试文件 main.test.js
const { describe, it, before } = require('@hapi/lab').script(); const Hapi = require('@hapi/hapi'); const externalDescribe = require('./externalFile.test.js'); describe('main', () => { let testServer; before(async () => { // 初始化hapi服务 testServer = Hapi.server({ port: 3000 }); // 注册路由、插件等初始化逻辑 await testServer.initialize(); }); describe('inner-main', () => { // 传入当前上下文的服务实例等参数 externalDescribe({ server: testServer }); it('当前文件专属测试用例', async () => { // 主文件独有测试逻辑 }); }); });
其他可选实现方式
如果你有多个测试文件都需要复用相同的测试逻辑,还可以用两种方案优化:
- 把公共的服务初始化、配置注入逻辑封装成独立的钩子函数,所有测试文件导入后直接注册到自己的
before/after钩子中即可 - 如果是全局通用的测试配置,也可以把参数挂载到lab的全局脚本对象中,不需要每次调用封装函数都手动传参
内容的提问来源于stack exchange,提问作者Laszlo Mile
相关产品推荐
相关产品推荐

