gpt4 book ai didi

javascript - 在导出进行单元测试之前等待申请?

转载 作者:行者123 更新时间:2023-12-01 00:21:41 25 4
gpt4 key购买 nike

我正在尝试使用 Jest 对我一直在开发的 Express API 进行单元测试,但是数据库必须在运行测试之前准备就绪。然而这似乎并没有发生。我有一个 server.ts 文件,其中包含:

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 函数,用于配置数据库并路由我的 Controller 。

在我的单元测试中,我有以下内容

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)
});
});

关于javascript - 在导出进行单元测试之前等待申请?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59361393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com