Node.js - 使用 supertest 测试 REST API 路由
Node.js - Testing REST API routes with supertest
Req.body 在发出 post 请求时无法在路由中访问。如果 he/she 帮助我度过难关,我将不胜感激。这是我的 microservice.test.js 文件的屏幕截图。我错过了什么吗?
import request from "supertest";
import mongoose from "mongoose";
import config from "../config/env";
import routes from "../server/routes";
import { parseResponse, doRequest } from "../server/utils/helperFunctions";
const app = express();
app.use("/", routes);
jest.setTimeout(30000);
expressjs 4以下版本包含body解析中间件
import bodyParser from 'body-parser';
app.use(bodyParser());
示例测试
it('.post should work with data', function (done) {
var app = express();
app.use(bodyParser());
app.post('/', function(req, res){
res.send(req.body.name);
});
request(app)
.post('/')
.send({ name: 'tobi' })
.expect('tobi', done);
})
所提供的代码没有提供太多见解,因为我希望请求的所有处理都在您的路由处理程序中。 运行 与 supertest
测试时无法访问正文的问题吗?或者它根本不起作用。更多信息将非常有帮助。
如果是 supertest
问题,我建议您查看 the docs for good examples。这是我直接从 NPM 站点提取的一个,他们 POST 一些带有请求正文的数据,然后验证响应正文:
describe('POST /user', function() {
it('user.name should be an case-insensitive match for "john"', function(done) {
request(app)
.post('/user')
.send('name=john') // x-www-form-urlencoded upload
.set('Accept', 'application/json')
.expect(function(res) {
res.body.id = 'some fixed id';
res.body.name = res.body.name.toLowerCase();
})
.expect(200, {
id: 'some fixed id',
name: 'john'
}, done);
});
});
另外,如果您正在尝试测试您的服务器,您应该导入您的服务器代码,而不是创建一个新的 express 实例。例如,在您的服务器代码中,您将拥有如下内容:
server.js
const express = require('express');
const app = express();
app.use('/', ...) // middleware/route config
...
module.exports = app;
您的服务器将像这样使用此服务器:
index.js
const app = require('./server')
const port = 4000
app.listen({ port }, () => {
const location = `http://localhost:${port}`
logger.info(` Server ready at ${location}`)
})
module.exports = app
现在您已经按照这种方式构建了代码,在您的测试中您也可以导入您的服务器(因此您正在测试您的实际服务器,而不是您创建的新服务器):
server.test.js
const app = require('../../../server');
const request = require('supertest')(app);
describe('Server', () => {
it('does a thing', async () => {
const { body } = await request
.post('http://path/to/test')
.send({ data: 'some data' })
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.expect(200);
expect(body.thing).toBeTrue();
});
});
Req.body 在发出 post 请求时无法在路由中访问。如果 he/she 帮助我度过难关,我将不胜感激。这是我的 microservice.test.js 文件的屏幕截图。我错过了什么吗?
import request from "supertest";
import mongoose from "mongoose";
import config from "../config/env";
import routes from "../server/routes";
import { parseResponse, doRequest } from "../server/utils/helperFunctions";
const app = express();
app.use("/", routes);
jest.setTimeout(30000);
expressjs 4以下版本包含body解析中间件
import bodyParser from 'body-parser';
app.use(bodyParser());
示例测试
it('.post should work with data', function (done) {
var app = express();
app.use(bodyParser());
app.post('/', function(req, res){
res.send(req.body.name);
});
request(app)
.post('/')
.send({ name: 'tobi' })
.expect('tobi', done);
})
所提供的代码没有提供太多见解,因为我希望请求的所有处理都在您的路由处理程序中。 运行 与 supertest
测试时无法访问正文的问题吗?或者它根本不起作用。更多信息将非常有帮助。
如果是 supertest
问题,我建议您查看 the docs for good examples。这是我直接从 NPM 站点提取的一个,他们 POST 一些带有请求正文的数据,然后验证响应正文:
describe('POST /user', function() {
it('user.name should be an case-insensitive match for "john"', function(done) {
request(app)
.post('/user')
.send('name=john') // x-www-form-urlencoded upload
.set('Accept', 'application/json')
.expect(function(res) {
res.body.id = 'some fixed id';
res.body.name = res.body.name.toLowerCase();
})
.expect(200, {
id: 'some fixed id',
name: 'john'
}, done);
});
});
另外,如果您正在尝试测试您的服务器,您应该导入您的服务器代码,而不是创建一个新的 express 实例。例如,在您的服务器代码中,您将拥有如下内容:
server.js
const express = require('express');
const app = express();
app.use('/', ...) // middleware/route config
...
module.exports = app;
您的服务器将像这样使用此服务器:
index.js
const app = require('./server')
const port = 4000
app.listen({ port }, () => {
const location = `http://localhost:${port}`
logger.info(` Server ready at ${location}`)
})
module.exports = app
现在您已经按照这种方式构建了代码,在您的测试中您也可以导入您的服务器(因此您正在测试您的实际服务器,而不是您创建的新服务器):
server.test.js
const app = require('../../../server');
const request = require('supertest')(app);
describe('Server', () => {
it('does a thing', async () => {
const { body } = await request
.post('http://path/to/test')
.send({ data: 'some data' })
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.expect(200);
expect(body.thing).toBeTrue();
});
});