Javascript 在导出单元测试之前等待应用程序?
我试图使用Jest对一个我一直在开发的express API进行单元测试,但是数据库必须在运行测试之前准备好。然而,这似乎并没有发生。我有一个server.ts文件,其中包含:Javascript 在导出单元测试之前等待应用程序?,javascript,node.js,typescript,express,ecmascript-6,Javascript,Node.js,Typescript,Express,Ecmascript 6,我试图使用Jest对一个我一直在开发的express API进行单元测试,但是数据库必须在运行测试之前准备好。然而,这似乎并没有发生。我有一个server.ts文件,其中包含: import App from './app'; import UsersController from './controllers/users.controller'; const app = new App(); app.initialize( [ new UsersController(),
import App from './app';
import UsersController from './controllers/users.controller';
const app = new App();
app.initialize(
[
new UsersController(),
]
);
if (process.env.NODE_ENV !== 'test') {
app.listen();
}
export default app;
app.initialize
是一个aysnc函数,用于配置数据库并路由我的控制器
在我的单元测试中,我有以下内容
import server from "../server";
import supertest from 'supertest';
const request = supertest(server.app);
it('should allow users to register', async () => {
// Arrange
const user = {
firstName: 'John',
lastName: 'Smith',
age: 42
};
return request.post('/api/users')
.send(user)
.set('Accept', 'application/json')
.then(response => {
expect(response).toEqual(user.firstName)
expect(response.body.lastName).toEqual(user.lastName)
expect(response.body.id).toBeGreaterThan(0)
});
});
然而,这会导致404错误,但是如果我删除服务器文件中“test”上的NODE_ENV检查,我可以看到app.listen()get在我的测试之后被调用,因此我认为可以安全地假设测试在该文件完成之前运行
为了完整起见,这里是我的应用程序类:
import "reflect-metadata";
import express from 'express';
import * as bodyParser from 'body-parser';
import {createConnection} from "typeorm";
import IController from './controllers/baseController.interface';
class App {
public app = express();
public port: number = 8080;
public ready: boolean = false;
public async initialize(controllers : [IController]) {
await createConnection().then(async connection => {
connection.synchronize();
this.initializeMiddlewares();
this.initializeControllers(controllers);
});
}
private initializeMiddlewares() {
this.app.use(bodyParser.json());
}
private initializeControllers(controllers : [IController]) {
controllers.forEach((controller) => {
this.app.use('/api/', controller.router);
});
}
public listen() {
this.app.listen(this.port, () => {
console.log(`App listening on the port ${this.port}`);
});
}
}
export default App;
您可以尝试将应用程序实例创建代码包装到函数中。然后,您可以在测试中等待它。在server.ts中,执行以下操作:
import App from './app';
import UsersController from './controllers/users.controller';
const getApp = async () => {
const app = new App();
await app.initialize(
[
new UsersController(),
]
);
}
getApp().then( appInstance => {
if (process.env.NODE_ENV !== 'test') {
appInstance.listen();
}})
export default getApp;
在测试文件中,只需调用函数即可获取应用程序实例:
import getApp from "../server";
import supertest from 'supertest';
it('should allow users to register', async () => {
const app = await getApp()
const request = supertest(app);
// Arrange
const user = {
firstName: 'John',
lastName: 'Smith',
age: 42
};
return request.post('/api/users')
.send(user)
.set('Accept', 'application/json')
.then(response => {
expect(response).toEqual(user.firstName)
expect(response.body.lastName).toEqual(user.lastName)
expect(response.body.id).toBeGreaterThan(0)
});
});
您可以尝试将应用程序实例创建代码包装到函数中。然后,您可以在测试中等待它。在server.ts中,执行以下操作:
import App from './app';
import UsersController from './controllers/users.controller';
const getApp = async () => {
const app = new App();
await app.initialize(
[
new UsersController(),
]
);
}
getApp().then( appInstance => {
if (process.env.NODE_ENV !== 'test') {
appInstance.listen();
}})
export default getApp;
在测试文件中,只需调用函数即可获取应用程序实例:
import getApp from "../server";
import supertest from 'supertest';
it('should allow users to register', async () => {
const app = await getApp()
const request = supertest(app);
// Arrange
const user = {
firstName: 'John',
lastName: 'Smith',
age: 42
};
return request.post('/api/users')
.send(user)
.set('Accept', 'application/json')
.then(response => {
expect(response).toEqual(user.firstName)
expect(response.body.lastName).toEqual(user.lastName)
expect(response.body.id).toBeGreaterThan(0)
});
});