为什么Jest用Express.js不识别Server实例?

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

首先,我是个初学者。我使用 express-generator 创建了一个 Express 项目,其中包含一个文件:binwww。www 实际上是一个包含服务器创建的 javascript 文件,就像下面的代码片段。

#!/usr/bin/env node

// This file is generated by express generator

var app = require('../app');
var debug = require('debug')('happy-meal:server');
var http = require('http');


var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

var server = http.createServer(app);

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

function normalizePort(val) {}
function onError(error) {}
function onListening() {}

// Added by myself
exports.module = server;

最后一行是我自己添加的,以便在jest测试中访问服务器实例。

所以,我想用下面的代码运行一个简单的集成测试。

// integration test: users.test.js
const request = require("supertest");

describe("/api/v1/users", () => {

    let server;

    beforeEach(() => {
        server = require("../../bin/www");
    });
    afterEach(() => {
        server.close();
    });

    describe("GET /", () => {
        it("should return all users", async (done) => {
            const res = await request(server).get("/api/v1/users");

            expect(res.status).toBe(200);
            done();
        });
    });
});

结果jest的错误输出如下:

TypeError: app.address is not a function

      14 |     describe("GET /", () => {
      15 |         it("should return all users", async (done) => {
    > 16 |             const res = await request(server).get("/api/v1/users");
         |                                               ^
      17 | 
      18 |             expect(res.status).toBe(200);
      19 |             done();

      at Test.serverAddress (node_modules/supertest/lib/test.js:55:18)
      at new Test (node_modules/supertest/lib/test.js:36:12)
      at Object.get (node_modules/supertest/index.js:25:14)
      at Object.<anonymous> (tests/integration/users.test.js:16:47)

  ● /api/v1/users › GET / › should return all users

    TypeError: server.close is not a function

       9 |     });
      10 |     afterEach(() => {
    > 11 |         server.close();
         |                ^
      12 |     });
      13 | 
      14 |     describe("GET /", () => {

      at Object.<anonymous> (tests/integration/users.test.js:11:16)

看起来它没有把 "server "这个变量识别为Server对象. 正因为如此,"server.close() "没有工作,结果服务器没有被关闭。同时,get-request也不能工作。再一次,服务器对象没有被看作是一个Server实例。

我到底做错了什么?希望您能在这里帮助我。

node.js express integration-testing jest
1个回答
1
投票

request(server) 不会工作,你必须使用你的。app 实例代替。

const app = require('../../app'); // Where your app instance is

...

const res = await request(app).get("/api/v1/users");

另外,首先尝试导入你的服务器,看看它是否被识别为Server对象。

编辑

要么你想在每次测试中都创建http服务器,要么你想为所有测试创建一次http服务器,然后在测试结束后关闭它。试试这个。

// integration test: users.test.js
const http = require('http');"
const request = require("supertest")
const app = require('../../app'); // Where your app instance is

describe("/api/v1/users", () => {
  beforeAll(done => {
      server = http.createServer(app);
      server.listen(done);
  });

  afterAll(done => {
      server.close(done);
  });

  describe("GET /", () => {
        it("should return all users", async (done) => {
            const res = await request(app).get("/api/v1/users");

            expect(res.status).toBe(200);
            done();
        });
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.