首先,我是个初学者。我使用 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实例。
我到底做错了什么?希望您能在这里帮助我。
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();
});
});
});