繁体   English   中英

为什么 Jest 无法识别带有 Express.js 的服务器实例?

[英]Why Jest doesn't recognise Server instance with Express.js?

首先,我有点初学者。 我使用 express-generator 创建了一个 Express 项目,其中包含一个文件:bin/www。 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;

我自己添加的最后一行是为了在玩笑测试中访问服务器实例。

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

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

这导致以下错误 output of 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)

看起来它没有将“服务器”变量识别为服务器 object。因此,“server.close()”不起作用,结果服务器没有关闭。 get-request 也不起作用。 再一次,服务器 object 未被视为服务器实例。

我究竟做错了什么? 我希望你能在这里帮助我。

request(server)将不起作用,您必须改用您的app实例:

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

...

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

另外,首先尝试导入您的服务器,看看它是否被识别为服务器 object。

编辑

要么你想在每次测试中创建 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();
        });
    });
});

暂无
暂无

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

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