gpt4 book ai didi

javascript - 确保服务器应用程序在 mocha 测试开始之前运行

转载 作者:IT老高 更新时间:2023-10-28 23:18:36 25 4
gpt4 key购买 nike

这类似于 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 block 中完全加载。

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 文件返回一个 promise 尝试另一种方式。还是不行

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
}))
}

在前面的钩子(Hook)里

 before(function(done,port){
test(3000).then(function(){
console.log('arguments: ',arguments)
done()
})
})

最佳答案

您的 server 模块没有回调,因此当您在 beforeEach 方法中调用 done() 时它无法准备好.

首先,在 server 模块中导出您的 app

然后,执行以下操作:

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 回调中被调用,因此在您的测试中服务器将正确监听。然后,记得在测试结束后关闭它(如果一个或多个测试套件中需要服务器,这很有用)。

关于javascript - 确保服务器应用程序在 mocha 测试开始之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38223053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com