0

我几乎没有测试 REST API 的测试用例,一切都在 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") 放在 mongoose.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)
              })
  })
}
4

0 回答 0