确保服务器应用程序在mocha测试开始之前运行 [英] Ensuring server app runs before mocha tests start

查看:98
本文介绍了确保服务器应用程序在mocha测试开始之前运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这类似于确保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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆