【问题标题】:Why Jest doesn't recognise Server instance with Express.js?为什么 Jest 无法识别带有 Express.js 的服务器实例?
【发布时间】:2020-09-01 20:06:48
【问题描述】:

首先,我有点初学者。我使用 express-generator 创建了一个 Express 项目,其中包含一个文件:bin/www. www 实际上是一个包含服务器创建的 javascript 文件,如下面的代码 sn-p:

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

这导致 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.close()”不起作用,因此服务器没有关闭。获取请求也不起作用。再一次,服务器对象不被视为服务器实例。

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

【问题讨论】:

    标签: node.js express jestjs integration-testing


    【解决方案1】:

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

    const app = require('../../app'); // Where your app instance is
    
    ...
    
    const res = await request(app).get("/api/v1/users");
    

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

    编辑

    您想在每个测试中创建 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();
            });
        });
    });
    

    【讨论】:

    • 我编辑了我的答案,尝试使用这个新的解决方案,它对我有用。如果没有,请记录错误以及应用程序文件中的内容
    • 谢谢我的朋友,这成功了!请添加“const http = require('http');”在顶部(对于其他开发人员)。你真的帮了我这个忙。
    • 不客气,伙计!哦,是的,对不起,我忘记了!谢谢:)
    猜你喜欢
    • 2014-04-25
    • 2017-04-28
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多