[eggjs/egg]使用 egg-mock 时如何拿到 port?

2025-11-14 580 views
4

当使用 egg-mock 时,如何拿到 mock app 正在监听的端口?

最小可复现仓库

请使用 npm init egg --type=simple bug 创建,并上传到你的 GitHub 仓库

复现步骤,错误日志以及相关配置
import assert = require('assert')
/* tslint:disable-next-line */
import { app } from 'egg-mock/bootstrap'

describe('test/app/controller/xxx.ts', () => {
  it('should yyy', () => {
      在测试里如何拿到 app.port?
  })


## 相关环境信息
- **操作系统**:
- **Node 版本**:
- **Egg 版本**:

回答

9

拿到了干嘛用?

4

想在一个 egg 项目里写一个单测来暴露 ctx.curl 的问题。

具体是这样的:

有两个 egg 项目:

  • egg-1 中有一个路由router.post('/xml', controller.handlePostXML) ,用来接收 post 过来的 xml 数据。
  • egg-2 中使用 ctx.curl() 往 egg-1 的 /xml 路由发送数据。照文档,应该是:
ctx.curl('https://egg-1/xml', {type: 'POST', contentType: 'application/xml', content: '<xml></xml'})

但实际上在 egg-1 中收到的数据会被解析成 object [object] 这样的字符串,而拿不到 <xml></xml>

在 egg-1 项目里,已经有单测保证 router.post('/xml') 是正常工作的,因为是用 supertest 发起的请求。

现在想在 egg-1 项目里再加一个测试,使用 ctx.curl 发起请求来重现问题,不知道有没有办法把 host 和 port 传给 ctx.curl 方法。

0

没看明白,你这是 2 个项目,1 的单元测试不应该跟 2 相关。

你这个问题跟是不是 curl 没关系,是对方请求的时候,少了 header 吧,你可以在 Controller 里面 assert 检查。

7

我想在1里用curl请求自己,这样也能重现curl 的问题。

的确加了header 可以解决,但是contentType 设置后文档说会自动设header ,所以想写个这样的单测暴露这个问题

获取 Outlook for Androidhttps://aka.ms/ghei36

8

我的意思是,你在 Controller 里面去校验 request header,或者甚至你直接校验收到的数据不就好了。

supertest 也可以设置错误的 header 来验证的。

2

@atian25 理解。我可能扯远了。我原来的问题是:如果要在单测里用 ctx.curl 去请求自己的路由,该如何拿到mock app所监听的端口?