我几乎没有测试 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)
})
})
}