【发布时间】:2016-11-08 10:46:18
【问题描述】:
这类似于 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
运行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()
})
})
})
以上似乎不起作用。尽管还提供了 done() 调用,但服务器并未在 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()
})
})
【问题讨论】:
标签: javascript node.js express mocha.js