ExpressJS服务器类chaiHttp

问题描述 投票:0回答:2

我正在尝试编写一些基本测试

这里是我的server.js

import express from 'express';

export default class Server {
  constructor(options) {
    this.port = options.port;
    this.express = express();
  }

  initialize() {
    this.configureRoutes();
    this.configureMiddleware();
  }

  start() {
    this.express.listen(this.port, () => {
      console.log(`Server listening on port ${this.port}!`);
    })
  }

  configureMiddleware() {
    // TODO
  }

  configureRoutes() {
    this.express.get('/', (req, res) => {
      res.status(200).send('Hello World!');
    });
  }

};

我喜欢使用类方法,因为它可以让我注入不同类型的配置。

这里是我的index.js,我没有在测试中使用它,但是显示server.js正在工作

import dotenv from 'dotenv';

import Server from './server';

dotenv.config();

const port = process.env.PORT;

const options = {
  port
};

let server = new Server(options);
server.initialize();
server.start();

export default server;

最后是我的server_spec.js

import dotenv from 'dotenv';
import chai from 'chai';
import chaiHttp from 'chai-http';

import Server from '../../src/server';

dotenv.config();

chai.use(chaiHttp);


describe('Red Pill Server', () => {
  let server;

  before('setup server', done => {
    const port = process.env.PORT;
    console.log(`port ${port}`);
    const options = {
      port
    };
    server = new Server(options);
    server.initialize();
    server.start();
    done();
  });

  it('should get a response from server', done => {
    chai.request(server).get('/').end( (err, res) => {
      if (err) {
        console.log(`err ->`, err);
      } else {
        expect(res).to.have.status(200);
      }
      done();
    })
  });

});

我正在获取TypeError: app.address is not a function,我查看了此stackoverflow question that it is related,但我无法找出问题所在。由于我正在导出类并在测试中进行初始化。

express chai chai-http
2个回答
0
投票

尝试将此添加到您的app.js文件:

module.exports = server

0
投票

最后进行一些小的更改,它开始工作。

第一步是要意识到chai期待“监听服务器”,所以在server.js中我做了一个小的更改

  start() {
    return this.app.listen(this.port, () => {
      console.log(`Server listening on port ${this.port}!`);
    })
  }

此更改后,我更改了描述测试的方式

describe('Red Pill Server', () => {
  let app;

  beforeEach(done => {
    const port = process.env.PORT;
    const host = process.env.HOST;
    console.log(`port ${port}`);
    const options = {
      port,
      host
    };
    let server = new Server(options);
    server.initialize();
    app = server.start();
    done();
  });

  afterEach(done => {
    app.close();
    done();
  });

  it('should get a response from server', done => {
    chai.request(app).get('/').end( (err, res) => {
      expect(res).to.have.status(200);
      expect(res.body).to.eql({ message: 'Hello World!' });
      done();
    });
  });

});

就像我在每次测试中创建/销毁服务器一样,应用程序是在index.js中创建的

© www.soinside.com 2019 - 2024. All rights reserved.