首页 文章

如何使用mocha和chai正确关闭测试之间的快速服务器

提问于
浏览
1

我正在寻找一种在测试之间完全重置我的快速服务器的正确方法!对我来说这似乎不仅仅是一个问题,许多其他用户也提出了同样的问题,而且很多博客文章都是在论证中写的 . 建议的解决方案对我来说不起作用也不令人满意 . 这里有另一个类似的问题和一篇很好描述问题的文章并提出了一些解决方案:

堆栈溢出Closing an express server after running jasmine specs

博客:https://glebbahmutov.com/blog/how-to-correctly-unit-test-express-server/

这里专门创建一个包来解决这个问题:https://www.npmjs.com/package/server-destroy

现在,重现我的条件的最小工作示例 . 在测试代码中,创建了一个快速服务器;当在某个 endpoints 上调用时,服务器会递增一个值并返回它:

( function() {
   'use strict'

   const enableDestroy = require( 'server-destroy' )
   const app = require( 'express' )()
   const http = require( 'http' )

   let val = 0

   app.use( '/inc', (req, res) => {
      val ++
      res.send(val.toString())
   } )

   const server = http.createServer( app )

   server.listen( 3000 )

   enableDestroy(server);

   module.exports = server

} )()

测试包括两个相同的测试用例;它们都调用 endpoints 上的服务器,并检查返回的值 . 提供 before_eachafter_each 部分是为了确保在单个测试用例运行之前创建新连接,然后关闭,以确保两个测试用例之间的独立性:

const chai = require( 'chai' )
const chaiHttp = require( 'chai-http' )
const expect = chai.expect
chai.use( chaiHttp )

let server

describe( 'first test group', () => {
   beforeEach( () => {
      server = require( './server' )
   } ),

   afterEach( ( done ) => {
      server.destroy( done )
      delete require.cache[require.resolve( './server' )]
   } ),

   it( 'should respond 1', ( done ) => {
      chai.request( server )
         .get( '/inc' )
         .set( 'Connection', 'close' )
         .end( ( err, res ) => {
            expect( res.text ).to.be.equal( '1' )
            done()
         } )
   } ),

   it( 'should respond 1', ( done ) => {
      chai.request( server )
         .get( '/inc' )
         .set( 'Connection', 'close' )
         .end( ( err, res ) => {
            expect( res.text ).to.be.equal( '1' )
            done()
         } )
   } )
} )

测试失败,因为第一次测试后服务器没有运行 . 请注意,在 after_each 部分,我强制缓存清理完全丢失了最后一个服务器实例 . 如果运行单个测试用例,则测试成功:

first test group
    ✓ should respond 1
    1) "after each" hook for "should respond 1"


  1 passing (70ms)
  1 failing

  1) first test group
       "after each" hook for "should respond 1":
     Error: Not running
      at Server.close (net.js:1620:12)
      at emitCloseNT (net.js:1671:8)
      at _combinedTickCallback (internal/process/next_tick.js:135:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

我使用的配置:

  • 节点8.11.1

  • 快递:"4.16.3"

  • 摩卡5.0.5

  • 柴4.1.2

  • chai-http 4.0.0

我怎么解决这个问题?错误信息是什么意思?

1 回答

  • 1

    它工作了一点点修改我没有使用 server-destroy 因为 server.close 工作得很好

    server.js

    // ( function() { // no need for this
       'use strict'
    
       //const enableDestroy = require( 'server-destroy' )
       const app = require( 'express' )()
       const http = require( 'http' )
    
       let val = 0
    
       app.use( '/inc', (req, res) => {
          val ++
          res.send(val.toString())
       } )
    
       const server = http.createServer( app )
    
       server.listen( 3000 )
    
       // enableDestroy(server);    
       module.exports = server
    
    // } )()
    

    test.js

    const chai = require( 'chai' )
    const chaiHttp = require( 'chai-http' )
    const expect = chai.expect
    chai.use( chaiHttp )
    
    let server
    
    describe( 'first test group', () => {
       beforeEach( () => {
          server = require( './server' )
       } ),
    
       afterEach( ( done ) => {
    
          // UPDATE DON'T CLOSE THE SERVER
    
          delete require.cache[require.resolve( './server' )]
          done()
    
          //server.close( () => {
          //   delete require.cache[require.resolve( './server' )]
          //   done()
          //})      
       } ),
    
       it( 'should respond 1', ( done ) => {
          chai.request( server )
             .get( '/inc' )
             .set( 'Connection', 'close' )
             .end( ( err, res ) => {
                expect( res.text ).to.be.equal( '1' )
                done()
             } )
       } ),
    
       it( 'should respond 1', ( done ) => {
          chai.request( server )
             .get( '/inc' )
             .set( 'Connection', 'close' )
             .end( ( err, res ) => {
                expect( res.text ).to.be.equal( '1' )
                done()
             } )
       } )
    } )
    

相关问题