Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在导出单元测试之前等待应用程序?_Javascript_Node.js_Typescript_Express_Ecmascript 6 - Fatal编程技术网

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

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(),

我试图使用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函数,用于配置数据库并路由我的控制器

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

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