首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保服务器应用程序在mocha测试开始之前运行

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

Stack Overflow用户
提问于 2016-07-06 11:35:26
回答 4查看 19K关注 0票数 12

这类似于确保Express应用程序在每次Mocha测试之前运行,但指定的解决方案仍然无法工作,我使用的是websocket服务器

简而言之,我使用的是一个名为套接字集群的websocket框架,这是我的服务器文件

代码语言:javascript
复制
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中指定的辅助进程。

代码语言:javascript
复制
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')
  })

}

我想测试服务器,但是在服务器真正启动之前,测试已经完成(失败)。在进行测试之前,我可以强制服务器完全加载吗?到目前为止,这就是我所拥有的

代码语言:javascript
复制
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()
    })
  })
})

以上这些似乎不起作用。尽管提供了as ()调用,但服务器并没有完全加载前一个块。

编辑--我尝试根据server.js文件的导入方式将server.js文件拆分为调用不同的服务器。

代码语言:javascript
复制
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中,我这样做--尽管如此,似乎仍然不起作用

代码语言:javascript
复制
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文件返回承诺的另一种方式。还是不管用

代码语言:javascript
复制
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
      }))
  }

在前钩子里

代码语言:javascript
复制
 before(function(done,port){
    test(3000).then(function(){
      console.log('arguments: ',arguments)
      done()
    })
  })
EN

回答 4

Stack Overflow用户

发布于 2016-07-06 12:27:35

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

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

然后,做一些如下的事情:

代码语言:javascript
复制
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回调中被调用,因此在您的测试中,服务器将正确地侦听。然后,记得在测试结束后关闭它(如果在一个或多个测试套件中需要服务器,则非常有用)。

票数 22
EN

Stack Overflow用户

发布于 2017-09-21 16:34:02

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

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

代码语言:javascript
复制
app.listen( port, ip, function()
{
  console.log( 'Server running on http://%s:%s', ip, port )
  app.emit( "app_started" )
})
module.exports = app

在test.js中:

代码语言:javascript
复制
var server = require( '../server' )
before( done =>
{
  server.on( "app_started", function()
  {
    done()
  })
})

在这种情况下,应用程序在侦听时发送一个"app_started“事件,测试代码将等待它。提供的URL包含更多详细信息。

希望能帮上忙!

票数 16
EN

Stack Overflow用户

发布于 2016-07-06 12:28:13

您需要等到服务器实际侦听给定端口。这可以通过在您的server.js中导出某种init函数来实现,该函数从mocha获取已完成的回调。

在你的server.js里

代码语言:javascript
复制
let initCallback;

[..]

app.listen(port, function() {
  if (initCallback) {
    initCallback();
  }
});


exports = {
  init: function(cb) {
    initCallback = cb;
  }
}

在你的测试中

代码语言:javascript
复制
beforeEach((done) => {
  require('../../server/server').init(done)
})

另见:如何知道node.js快速服务器何时启动并准备使用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38223053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档