Я ищу правильный способ полностью сбросить мой экспресс-сервер между тестами! Кажется, это проблема не только для меня, многие другие пользователи задавали тот же вопрос, и по этому поводу было написано много сообщений в блогах. Предложенные решения не работают и не удовлетворяют меня. Здесь есть еще один похожий вопрос и статья, которая хорошо описывает проблему и предлагает некоторые решения:
Переполнение стека Закрытие экспресс-сервера после запуска спецификаций jasmine а>
Блог: https://glebbahmutov.com/blog/how-to-correctly-unit-test-express-server/
Здесь специально создан пакет для решения этой проблемы: https://www.npmjs.com/package/server-destroy
Теперь минимальный рабочий пример для воспроизведения моего состояния. В тестируемом коде создается экспресс-сервер; при вызове на какой-либо конечной точке сервер увеличивает значение и возвращает его:
( 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_each
и after_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
- чай-http 4.0.0
Как я могу решить эту проблему? И что означает сообщение об ошибке?
express
, напримерsupertest
? - person user2347763   schedule 12.04.2018chai-http
, не так ли? - person Elia   schedule 12.04.2018