Интеграционный тест Single Jest работает, но несколько тестов не пройдены - PullRequest
0 голосов
/ 19 января 2020

У меня странная проблема с моими интеграционными тестами Jest. Если я запускаю тесты один за другим, они проходят без проблем. Если я выполню несколько тестов в одном go, они не пройдут с «случайными» сообщениями о проблемах. Случайный, в том числе количество неудачных тестов варьируется за один прогон. Поэтому, если я запускаю один и тот же набор тестов несколько раз, он может сообщить о 31 неудачном тесте на одном go и 17 неудачных тестах на следующем.

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

Вызов Jest, который я использую для запуска тестов, выглядит следующим образом : jest --verbose --detectOpenHandles --testRegex '/test/integration/sc.*\\.test\\.js' (я тоже пытался добавить --runInBand, но это не имело значения для возникающих проблем)

Все мои интеграционные тесты Jest имеют одинаковую структуру. Я покажу вам начало двух из них:

const request = require('supertest');
const {Score } = require('../../models/score');

describe('/api/scores', () => {
  let server; 

  beforeEach(async () => { 
    delete require.cache[require.resolve('../../index')];    
    server = await require('../../index'); 
  });

  afterEach(async () => { 
    await Score.deleteMany({}).exec();
    await server.close(); 
  });  

  afterAll(async () => { 
    delete require.cache[require.resolve('../../index')];    
    server = await require('../../index'); 
    Score.collection.drop();
    await server.close();
  });

  describe('GET /', () => {
     ...

и

const request = require('supertest');
const { Sessie } = require('../../models/sessie');
const { Check } = require('../../models/check');
const { Opdracht } = require('../../models/opdracht');
const { Score } = require('../../models/score');
const { Speler } = require('../../models/speler');

describe('/api/sessies', () => {
  let server; 

  beforeEach(async () => { 
    delete require.cache[require.resolve('../../index')];    
    server = await require('../../index'); 
  });

  afterEach(async () => { 
    await Sessie.deleteMany({}).exec();
    await Check.deleteMany({}).exec();
    await Opdracht.deleteMany({}).exec();
    await Score.deleteMany({}).exec();
    await Speler.deleteMany({}).exec();
    await server.close(); 
  });  

  afterAll(async () => { 
    delete require.cache[require.resolve('../../index')];    
    server = await require('../../index'); 
    Sessie.collection.drop();
    Check.collection.drop();
    Opdracht.collection.drop();
    Score.collection.drop();
    Speler.collection.drop();
    await server.close();
  });

  describe('GET /', () => {
     ...

Может быть, я иду за борт со всеми удалениями deleteMany и коллекции, но я просто хотел быть действительно уверен, что разные тесты не могут испортить результаты друг друга.

О, и для запуска сервера express используется требование "../../index":

const express = require('express');
const cors = require('cors')
const app = express();
app.use(cors());

[...]

const port = process.env.PORT || 3000;
const server = app.listen(port, () => logger.info(`Listening on host [...] and port ${port}...`));

module.exports = server;

(Я запускаю Express 4.17, Пн goose 5.6.8 и Jest 24.9)

Почему мои тесты проваливаются в серии, а не при отдельном запуске?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...