确保服务器应用程序在mocha测试开始之前运行 [英] Ensuring server app runs before mocha tests start
问题描述
这类似于确保Express App在每个之前运行Mocha Test ,但是指定的解决方案仍然无法工作+我正在使用websocket服务器
This is similar to Ensuring Express App is running before each Mocha Test , but the specified solution still isnt working + i'm using a websocket server
简而言之,我正在使用一个名为socketcluster的websocket框架这是我的服务器文件
in short , i'm using a websocket framework called socketcluster and this is my server file
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
运行节点server.js
启动在worker.js中指定的工作进程
running node server.js
starts the worker process specified in 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')
})
}
我想测试服务器,但是在服务器实际启动之前,测试正在完成(并且失败)。有没有办法在进行测试之前强制服务器完全加载?这就是我到目前为止
I want to test the server , but the tests are finishing (and failing) way before the server actually starts. is there a way i can force the server to fully load before going ahead with tests? this is what i have so far
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()调用,服务器也不会在之前的块中完全加载。
the above doesnt seem to work. the server doesnt fully load in the before block despite providing the done() call as well.
编辑 - 我试过拆分服务器.js文件根据其导入方式调用不同的服务器。
edit - i've tried splitting the server.js file to invoke a different server based on how its imported.
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中,我这样做这个 - 似乎仍然无法工作
and in test.js , i do this - still doesnt seem to work though
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文件返回一个承诺,以另一种方式。仍然无法工作
edit:2 - trie another way by returning a promise from the server.js file. still doesnt work
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()
})
})
推荐答案
您的服务器
模块没有回调,因此当您在之前中完成
方法。 完成
时,它无法准备好
Your server
module doesn't have a callback, so it could not be ready when you call done()
in your beforeEach
method.
首先,在服务器
模块中导出 app
。
First, export your app
in your server
module.
然后,执行以下操作:
const app = require('../../server/server').app;
let server;
before(done => {
server = app.listen(3000, done);
});
/**
...
your tests here
...
**/
/** and, if you need to close the server after the test **/
after(done => {
server.close(done);
});
这样, done()
将是在 listen
回调中调用,因此在测试中服务器将正确监听。然后,记得在测试结束后关闭它(如果在一个或多个测试套件中需要服务器,则非常有用)。
This way, done()
will be called in the listen
callback, so in your tests the server will be listening correctly. Then, remember to close it after tests end (useful if server is required in one or more test suites).
这篇关于确保服务器应用程序在mocha测试开始之前运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!