Egg: 如何获取mm.app()启动后http的端口?

Created on 5 May 2017  ·  16Comments  ·  Source: eggjs/egg

  • Node Version:
  • Egg Version:
  • Plugin Name:
    egg-mock
  • Plugin Version:
  • Platform:

    为什么需要获得端口?

有些websocket的内容需要单元测试,并且有些外部的内容必须要mock.
我看过egg-socket.io 里面的测试,都是启动的mm.cluster() .
这个获得端口容易,直接app.port就行了.
但是mm.cluster() 有个问题,好像没法mock.
于是考虑用下mm.app() ,这个支持mock,但是发现取不到启动端口,socket.io-client 没法连接....
后来看了下源码,发现mm.app() 里面是会写端口的

    this.options.clusterPort = yield detectPort();

问题是,mm.app() 里面的大部分内容都被代理到内部的_app 里面去了,取不到端口了..

说了这么多也挺费劲... 总之就是希望egg-mock的mm.app() 方法对外暴露http监听端口..

Most helpful comment

https://github.com/eggjs/egg/issues/858 实现真正的 cluster mock function

All 16 comments

用 mm.cluster,mm.app 不会运行 master 进程。

before(function* () {
  app = mm.cluster();
  yield app.ready();
  console.log(app.port)
});

请问 mm.cluster(); 现在有没有办法做mock. 比如我想在单元测试的时候mock一下 app.ctx.wxUser() 方法.

我擦,居然可以这样
app/extend/context.unittest.js
https://eggjs.org/zh-cn/basics/extend.html
牛逼的设计啊

原来 cluster 也可以这样 mock 了,好想法。

这个办法确实是意外收获,cluster 模式启动也可以mock了

https://github.com/eggjs/egg/issues/858 实现真正的 cluster mock function

还是希望能暴露一个app.port方法,获取当前端口

还是希望能暴露一个app.port方法,获取当前端口

clusterPort 和 port 是两回事。

port 通过 app.server 可以拿到。

@atian25 抱歉啊,我找了好久也没找到app.server在哪获取port

app.server 就是一个 Node HTTP SERVER 啊,你可以看下它的文档,在 address 里面的

@atian25 谢谢回答!
不过在test的时候,app.server对象不存在。监听了app._appserver事件,好像没有创建server

附:最小可运行版本https://github.com/whlsxl/egg-mock

因为是 supertest 启动的,单测期间读取 port 的意图是?

看下 SuperTest 的源码就知道了。

https://github.com/visionmedia/supertest/blob/master/lib/test.js#L59

  it('should GET /', async () => {
    const testInstance = app.httpRequest().get('/');
    console.log(testInstance.app.address());
    console.log(testInstance.url);

    return testInstance
      .expect('hi, egg')
      .expect(200);
  });

测试socktio啊,折磨死了。。难道有其他方式?

@atian25 请问除了这种获取port方式 还有没有其他方式了呢?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

kylezhang picture kylezhang  ·  3Comments

dizhifeng picture dizhifeng  ·  3Comments

weijiatan456 picture weijiatan456  ·  3Comments

lvgg3271 picture lvgg3271  ·  3Comments

Azard picture Azard  ·  3Comments