使用Ava与Test-Listen测试Micro端点时返回undefined问题排查
解决Micro框架路由测试返回undefined的问题
我帮你梳理下问题所在,主要有这几个坑:
1. 路由代码的语法错误与依赖缺失
你的routes.js里有两个明显的问题:
- hello函数末尾多了一个多余的
),这会直接触发语法错误,导致函数无法正常定义,请求进来自然得不到正确响应。 send方法是Micro框架提供的核心方法,但你没有从micro模块中导入它,这会导致send未定义,根本没法返回内容。
另外,你用到的router和post应该来自microrouter包,记得要确保已经安装了这个依赖(npm install microrouter)。
2. 测试代码不完整
你给出的测试环境代码没写完:async-to-gen/register的配置截断了,而且缺少实际的测试用例逻辑——没有启动服务、发起请求和断言结果的代码,自然没法验证返回值。
修正后的完整代码
routes.js
const { send } = require('micro'); const { router, post } = require('microrouter'); const hello = async (req, res) => { send(res, 200, `Hello, ${req.params.who}`); }; module.exports = router( post('/hello/:who', hello), );
测试文件(比如test.js)
'use strict'; const listen = require('test-listen'); const micro = require('micro'); const test = require('ava'); const got = require('got'); // 补全async-to-gen的注册配置,匹配你的js文件 require('async-to-gen/register')({ includes: /\.js$/ }); // 导入路由服务 const service = micro(require('./routes')); test('hello接口返回预期内容', async t => { // 启动服务并获取测试地址 const url = await listen(service); // 发起POST请求 const response = await got.post(`${url}/hello/Cloudscape`, { responseType: 'text' }); // 断言返回结果符合预期 t.is(response.body, 'Hello, Cloudscape'); // 测试结束关闭服务 service.close(); });
这样调整后,再运行测试应该就能得到预期的Hello, xxx内容了。
内容的提问来源于stack exchange,提问作者cloudscape-germany
相关产品推荐
相关产品推荐

