Запуск нескольких файлов и наборов мокко с одинаковым контекстом - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь запустить несколько интеграционных тестов с некоторым общим контекстом. Разделяемый контекст - это одно экспресс-приложение, и я пытаюсь поделиться им по наборам / файлам, потому что для его раскрутки требуется несколько секунд.

Я заставил его работать, создав экземпляр набора тестов мокко "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)
        })
...

но когда я это делаю, тестовые наборы просто не запускаются. Тайм-аут по умолчанию просто истечет, и если я установлю более высокий тайм-аут, он просто будет сидеть (в ожидании более длительного тайм-аута). Если я подключаюсь к сеансу отладки, то тест завершается немедленно, и после него никогда не вызывается ловушка после (и раньше!).

Я открыт для других идей о том, как это сделать, но яне нашел хороших решений, которые позволили бы разделить некоторый контекст между тестами, разбивая их на разные файлы.

...