这类似于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()调用,但服务器并未完全加载前一个块。
编辑 - 我已经尝试拆分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()
})
})
})
编辑: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()
})
})
感谢您的回答..但它看起来像监听方法是在socketcluster源代码内建的地方。 :/看起来像改变node_modules源是唯一的选择 – Kannaj
我做了一些改变的代码..可以通过类似的方式实现解决方案?仍然似乎没有工作,虽然 – Kannaj