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

Kan*_*naj 10 javascript mocha.js node.js express

这类似于每个Mocha测试之前运行的Ensuring Express App,但指定的解决方案仍然无法工作+我正在使用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
Run Code Online (Sandbox Code Playgroud)

running node server.js启动worker.js中指定的worker进程

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

}
Run Code Online (Sandbox Code Playgroud)

我想测试服务器,但测试在服务器实际启动之前完成(并且失败).有没有办法在进行测试之前强制服务器完全加载?这就是我到目前为止所拥有的

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()
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

上面似乎没有用.尽管提供了done()调用,服务器也不会在before块中完全加载.

编辑 - 我尝试拆分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()
}
Run Code Online (Sandbox Code Playgroud)

在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()
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

编辑: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
      }))
  }
Run Code Online (Sandbox Code Playgroud)

并在之前的钩子

 before(function(done,port){
    test(3000).then(function(){
      console.log('arguments: ',arguments)
      done()
    })
  })
Run Code Online (Sandbox Code Playgroud)

小智 12

你的server模块没有回调,所以当你调用它可能还没有准备好done()你的beforeEach方法.

首先,导出您appserver模块.

然后,做一些像:

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);
});
Run Code Online (Sandbox Code Playgroud)

这样,done()将在listen回调中调用,因此在测试中服务器将正确监听.然后,记得在测试结束后关闭它(如果在一个或多个测试套件中需要服务器,则很有用).


小智 9

这里解释的解决方案对我有用,特别是:

在server.js(或app.js)的末尾:

app.listen( port, ip, function()
{
  console.log( 'Server running on http://%s:%s', ip, port )
  app.emit( "app_started" )
})
module.exports = app
Run Code Online (Sandbox Code Playgroud)

并在test.js中:

var server = require( '../server' )
before( done =>
{
  server.on( "app_started", function()
  {
    done()
  })
})
Run Code Online (Sandbox Code Playgroud)

在这种情况下,app会在侦听时发送"app_started"事件,测试代码会等待它.提供的URL包含更多详细信息.

希望能帮助到你 !

  • 对我不起作用。给出错误:超过2000毫秒超时。对于异步测试和挂钩,请确保调用了“ done()”;如果返回一个Promise,请确保它可以解决。 (3认同)