这类似于确保 Express 应用程序在每次 Mocha 测试之前运行 https://stackoverflow.com/questions/18941736/ensuring-express-app-is-running-before-each-mocha-test,但指定的解决方案仍然不起作用+我正在使用 websocket 服务器
简而言之,我正在使用一个名为 socketcluster 的 websocket 框架,这是我的服务器文件
import {SocketCluster} from 'socketcluster';
const socketCluster = new SocketCluster({
workers:1,
brokers:1,
port: 3000,
appName:null,
initController: __dirname + '/init.js',
workerController: __dirname + '/worker.js',
brokerController: __dirname + '/broker.js',
socketChannelLimit: 1000,
crashWorkerOnError: true
})
export default socketCluster
running node server.js
启动worker.js中指定的工作进程
export const run = (worker) => {
console.log(' >> worker PID: ',process.pid);
const app = express();
const httpServer = worker.httpServer;
const scServer = worker.scServer;
app.use(cookieParser())
httpServer.on('request', app);
app.get('/',(req,res) => {
console.log('recieved')
res.send('Hello world')
})
}
我想测试服务器,但测试在服务器实际启动之前就完成了(并且失败了)。有没有办法在继续测试之前强制服务器完全加载?这就是我到目前为止所拥有的
describe('Express server',() =>{
beforeEach((done) => {
require('../../server/server')
done()
})
it('should return "Hello World"',(done) => {
http.get('http://127.0.0.1:3000',(res) => {
expect(res).to.contain('wtf world')
done()
})
})
})
上面的似乎不起作用。尽管也提供了 did() 调用,但服务器并未在 before 块中完全加载。
edit- 我尝试拆分 server.js 文件以根据其导入方式调用不同的服务器。
const main = () => {
console.log('main server')
new SocketCluster({
workers:1,
brokers:1,
port: 3000,
appName:null,
initController: __dirname + '/init.js',
workerController: __dirname + '/worker.js',
brokerController: __dirname + '/broker.js',
socketChannelLimit: 1000,
crashWorkerOnError: true
})
}
export const test = (port,done) => {
console.log('testing server')
new SocketCluster({
workers:1,
brokers:1,
port: port,
appName:null,
initController: __dirname + '/init.js',
workerController: __dirname + '/worker.js',
brokerController: __dirname + '/broker.js',
socketChannelLimit: 1000,
crashWorkerOnError: true
})
done()
}
if (require.main === module){
main()
}
在 test.js 中,我这样做了 - 似乎仍然无法解决
import {expect} from 'chai';
import {test} from '../../server/server'
describe('Express server',() =>{
before(function(done){
test(3000,done)
})
it('should return "Hello World"',(done) => {
http.get('http://127.0.0.1:3000',(res) => {
expect(res).to.contain('world')
done()
})
})
})
edit:2- 尝试另一种方法,从 server.js 文件返回一个承诺。还是不行
export const test = (port) => {
console.log('testing server')
return Promise.resolve(new SocketCluster({
workers:1,
brokers:1,
port: port,
appName:null,
initController: __dirname + '/init.js',
workerController: __dirname + '/worker.js',
brokerController: __dirname + '/broker.js',
socketChannelLimit: 1000,
crashWorkerOnError: true
}))
}
并在之前的钩子中
before(function(done,port){
test(3000).then(function(){
console.log('arguments: ',arguments)
done()
})
})