Я пытаюсь запустить несколько интеграционных тестов с некоторым общим контекстом. Разделяемый контекст - это одно экспресс-приложение, и я пытаюсь поделиться им по наборам / файлам, потому что для его раскрутки требуется несколько секунд.
Я заставил его работать, создав экземпляр набора тестов мокко "runner", в котором были бы функции тестирования, которые при необходимости могли бы просто require
каждый файл теста, и это работало хорошо (побочный эффект заключается в том, чтотест, требующий, чтобы дочерний тестовый файл завершился как «успешный», прежде чем любой из тестов внутри файла фактически запустится, но это была незначительная проблема)
// test-runner.js:
describe('Integration tests', function () {
let app
let log
this.timeout(300000) // 5 mins
before(function (done) {
app = require('../app')
app.initialize()
.then(() => {
done()
})
.catch(err => {
log.error(err)
done(err)
})
})
it('Running api tests...', (done) => {
require('./integration/api.test')(app)
done()
})
// ./integration/api.test.js:
module.exports = (app) => {
let api = supertest.agent(app)
.set('Content-Type', 'application/json')
describe('Authorization', () => {
describe('Trying to access authorization sections', () => {
it('should be denied for /home', async () => {
await api.get(`${baseUrl}/home`)
.expect(STATUS_CODE.UNAUTHORIZED)
})
...
Проблема:
Я хочу сообщить тестирующему, что все тесты в импортированном наборе завершены, чтобы я мог вызвать логику завершения работы в тестовом организаторе и завершить тест полностью. В стандартных тестовых функциях вы можете передать функцию done
, чтобы сигнализировать о завершении кода в тесте, поэтому я завернул каждый из дочерних тестов в блок описания, чтобы использовать хук after
, чтобы сигнализировать о том, что весь тестовый модульбыло сделано:
// test-runner.js:
describe('Integration tests', function () {
let app
let log
this.timeout(300000) // 5 mins
before(function (done) {
app = require('../app')
app.initialize()
.then(() => {
done()
})
.catch(err => {
log.error(err)
done(err)
})
})
it('Running api tests...', (done) => {
require('./integration/api.test')(app, done)
})
// ./integration/api.test.js:
module.exports = (app, done) => {
let api = supertest.agent(app)
.set('Content-Type', 'application/json')
describe('All api tests', () => {
let api
before(() => {
api = supertest.agent(app)
.set('Content-Type', 'application/json')
})
after(() => {
done() // should be calling the done function passed in by test runner
})
describe('Authorization', () => {
describe('Trying to access authorization sections', () => {
it('should be denied for /home', async () => {
await api.get(`${baseUrl}/home`)
.expect(STATUS_CODE.UNAUTHORIZED)
})
...
но когда я это делаю, тестовые наборы просто не запускаются. Тайм-аут по умолчанию просто истечет, и если я установлю более высокий тайм-аут, он просто будет сидеть (в ожидании более длительного тайм-аута). Если я подключаюсь к сеансу отладки, то тест завершается немедленно, и после него никогда не вызывается ловушка после (и раньше!).
Я открыт для других идей о том, как это сделать, но яне нашел хороших решений, которые позволили бы разделить некоторый контекст между тестами, разбивая их на разные файлы.