Мокко и Чай дают ошибку не вызывая done () даже после того, как он вызван - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть несколько тестов для тестирования API REST, и все в Typescript. Я также использую docker для Dockerize моего приложения. У меня есть 3 контейнера, которые REST_API_app, MongoDB, api_testing_container. Я создаю контейнер api_testing_container после того, как будут созданы другие два, и он использует тот же образ, который создан для REST_API_app. Также я видел много сообщений об увеличении времени ожидания мокко с использованием --timeut, но это не то, что я ищу, и это также не работает в моем коде, я пробовал это. Мой файл тестового примера выглядит следующим образом:

import { expect } from 'chai';
import request from 'supertest';

import app from '../app';
import * as mongodb from '../mongo/connection';

describe('Testing the API', () => {

    before((done) => {
        mongodb.connectMock()
            .then(() => done())
            .catch((err:any) => done(err))
    })

    it('OK, adding new employee', (done) => {
        request(app).put('/add')
            .send(<some JSON data>)
            .then(res => {
                ...some matcher
                done();
            })
            .catch(err => done(err));
    })

   it('OK, getting all employees', (done) => {
        request(app).get('/all')
            .then(res => {
                ...some matcher
                done();
            })
            .catch(err => { 
                done(err)
            });
    })

   it('OK, getting employee by ID', (done) => {

        request(app)
            .get(`/create/${id}`)
            .then(res => {
                ...some matcher
                done();
            })
            .catch(err => done(err));
    }) 
})

Когда я пытаюсь запустить вышеупомянутые тестовые случаи, он отлично работает на локальной машине без docker, но когда я создаю все три контейнера с docker -compose он показывает следующую ошибку в тестовом контейнере

api_testing_container |   Testing the API
    1) "before all" hook for "OK, adding new employee"b
api_testing_container | 
api_testing_container | 
api_testing_container |   0 passing (20s)
api_testing_container |   1 failing
api_testing_container | 
api_testing_container |   1) Testing the API
api_testing_container |        "before all" hook for "OK, adding new employee":
api_testing_container |      Error: Timeout of 20000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/usr/src/app/src/test/employee.spec.ts)
api_testing_container |       at listOnTimeout (internal/timers.js:549:17)
api_testing_container |       at processTimers (internal/timers.js:492:7)

Мое соединение mongodb для макета выглядит следующим образом. Кажется, ошибка в этом файле, когда я помещаю console.log ("test") перед mon goose .connect (), он не печатает его.

import mongoose from 'mongoose';
import {Mockgoose} from 'mockgoose';

export let connect = () => {
  return new Promise((resolve, reject) => {
      const uri: string = 'mongodb://mongo:27017/rest_api_container';
      mongoose.connect( uri, { useNewUrlParser: true, useUnifiedTopology: true })
                .then(() => { 
                  console.log('MongoDB Connected'); 
                  resolve();
                })
                .catch(err => {
                  console.log(err)
                  reject();
                });
  })

}

export let connectMock = () => {
  return new Promise((resolve, reject) => {

    let mockgoose: Mockgoose = new Mockgoose(mongoose);

    mockgoose.prepareStorage()
              .then(() => { 
                const uri: string = 'mongodb://mongo:27017/rest_api_container';
                mongoose.connect( uri, { useNewUrlParser: true, useUnifiedTopology: true })
                          .then((res) => { 
                            console.log('Mock MongoDB Connected'); 
                            resolve(res);
                          })
                          .catch((err :any)=> {
                            console.log(err)
                            reject(err);
                          });
              })
              .catch((err: any) => {
                console.log(err);
                reject(err)
              })
  })
}
...