有些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监听端口..
用 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._app的server事件,好像没有创建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方式 还有没有其他方式了呢?
Most helpful comment
https://github.com/eggjs/egg/issues/858 实现真正的 cluster mock function