這類似於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