导出服务器进行集成测试时的React Jest问题

时间:2020-02-20 13:46:38

标签: javascript reactjs testing jestjs supertest

一种非常简单的情况,我正在尝试导入app.listen(port)进行测试。测试将失败(失败原因:app.address不是函数,而server.close不是函数)。实际上,服务器变量返回了一个空对象,因此导入未正确完成,这就是测试用例失败的原因...

genres.test.js

const request = require("supertest");

let server;

describe("/api/genres", () => {
  beforeEach(() => {
    server = require("../../index");
  });
  afterEach(() => {
    server.close();
  });

  describe("GET /", () => {
    it("should return all genres", async () => {
      const res = await request(server).get("/api/genres");
      expect(res.status).toBe(200);
    });
  });
});

index.js

const express = require("express");
const app = express();

const port = process.env.PORT || 3000;
    const server = app.listen(port, () => console.log(`Listening on port ${port}`));

    module.exports = server;

我是否缺少有关导入的信息? 让我知道是否需要更多代码行/部分(请注意,我提供的index.js尚不完整)或是否需要完整的错误消息。

我知道这个问题已经被问过几次了,但是在大多数情况下,解决方案是导入app.listen而不是我已经做过的app。 我还尝试使用导出默认值而不是module.exports。

1 个答案:

答案 0 :(得分:1)

对我有用。

index.js

const express = require('express');

const app = express();
const port = process.env.PORT || 3000;

app.get('/api/genres', (req, res) => {
  console.log('api genres');
  res.sendStatus(200);
});

const server = app.listen(port, () => console.log(`Listening on port ${port}`));

module.exports = server;

index.test.js

const request = require('supertest');

let server;

describe('/api/genres', () => {
  beforeEach(() => {
    server = require('./index');
  });
  afterEach(() => {
    server.close();
  });

  describe('GET /', () => {
    it('should return all genres', async () => {
      const res = await request(server).get('/api/genres');
      expect(res.status).toBe(200);
    });
  });
});

测试结果:

 PASS   apollo-graphql-tutorial  src/stackoverflow/60321422/index.test.js
  /api/genres
    GET /
      ✓ should return all genres (289ms)

  console.log src/stackoverflow/60321422/index.js:11
    Listening on port 3000

  console.log src/stackoverflow/60321422/index.js:7
    api genres

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.693s, estimated 2s