gpt4 book ai didi

node.js - 如何使用 mocha 和 chai 在测试之间正确关闭快速服务器

转载 作者:行者123 更新时间:2023-12-03 12:11:34 25 4
gpt4 key购买 nike

我正在寻找一种正确的方法来在测试之间完全重置我的 express 服务器!看来这不仅仅是我的问题,很多其他用户也问过同样的问题,
并且已经写了许多关于这个论点的博客文章。提出的解决方案对我来说既不奏效也不令人满意。这里有另一个类似的问题和一篇文章,很好地描述了问题并提出了一些解决方案:

堆栈溢出
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

现在,一个最小的工作示例来重现我的情况。
在被测代码中,创建了一个 express 服务器;当在某个端点上调用时,服务器增加一个值并返回它:

( 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

} )()

测试包含两个相同的测试用例;他们都在端点上调用服务器,并检查返回值。 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)

我使用的配置:
  • Node 8.11.1
  • express :“4.16.3”
  • Mocha 5.0.5
  • Chai 4.1.2
  • Chai http 4.0.0

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

    最佳答案

    它只需稍作修改即可使用
    我没有用 server-destroyserver.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()
    } )
    } )
    } )

    关于node.js - 如何使用 mocha 和 chai 在测试之间正确关闭快速服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49789886/

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