简体   繁体   English

在导出单元测试之前等待应用程序?

[英]await application before exporting for unit testing?

I'm attempting to use Jest to unit test an express API I've been working on however the database has to be ready before it runs the test.我正在尝试使用 Jest 对我一直在研究的快速 API 进行单元测试,但是数据库必须在运行测试之前准备好。 This does not seem to be happening however.然而,这似乎并没有发生。 I have a server.ts file which contains:我有一个 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 is an aysnc function which configures the database and routes my controllers. app.initialize是一个 aysnc 函数,它配置数据库并路由我的控制器。

In my unit test I then have the following在我的单元测试中,我有以下内容

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

This however falls over with a 404 error, however if I remove the NODE_ENV check on "test" in the server file I can see that app.listen() get's called well after my test so I believe it's safe to assume that the tests are running before that file has finished.然而,这会因 404 错误而失败,但是如果我删除服务器文件中“test”的 NODE_ENV 检查,我可以看到 app.listen() 在我的测试之后被很好地调用,所以我相信可以安全地假设测试是在该文件完成之前运行。

For completeness here is my App class:为了完整起见,这是我的 App 类:

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;

You can try wrapping your App instance creation code inside a function.您可以尝试将您的 App 实例创建代码包装在一个函数中。 You can then wait for it inside your tests.然后,您可以在测试中等待它。 In your server.ts do the following:在您的 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;

In your test file just call the function to get your app instance:在您的测试文件中,只需调用该函数即可获取您的应用程序实例:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM