如何使用supertest测试Express应用程序的POST请求参数?

时间:2014-04-15 06:07:35

标签: node.js http testing express supertest

我正在使用Express 4.0.0创建API,其中一条路由需要POST。目前,我只是想让它回应请求参数中发送的名称。响应是一个JSON对象,但请求需要表单字段。

users.post '/user', (req, res) ->
    res.json name: req.params.name

我的测试将type()设置为form,这应允许send()将哈希值作为POST参数/字段传递。

describe 'POST /user', ->
    it 'should echo the name sent', (done) ->
        request app
        .post '/user'
        .type 'form'
        .send name: 'Foo'
        .expect '{"name":"Foo"}'
        .end done

无论如何,我的测试失败,在快递中,我的req.params为空,req.param('name')出现undefinedreq.body也为空。

是否有某些req.fields属性我不知道,或者我的测试存在缺陷?

1 个答案:

答案 0 :(得分:2)

tl; dr:您需要解析正文以获得该功能,您可以执行app.use(require('body-parser')()),然后使用name: req.param('name')更改代码。

因此,只要收到http请求标头而不是请求正文,express(实际上是node.js http服务器)就会调用请求调用。你必须明确地阅读并等待身体来自己解析它。

幸运的是,有快速的中间件模块可以为您解析正文。在这种情况下,您将发送urlencoded / form正文,因此您需要解析它。根据他们的例子使用任何这些模块:

假设您使用body-parser,那么如果您希望它解析所有路线的正文,那么只需app.use(require('body-parser')()。如果您希望它解析特定路线的正文,请执行以下操作:

bodyParser = require('body-parser')()
app.post '/user', bodyParser, (req, res) ->
    res.json name: req.param('name')

一旦你正确解析了身体,你就可以通过req.body(例如req.body.name)属性或req.param函数(例如req.param('name'))来访问它。后者还将搜索查询字符串和url参数。

请注意,如果您想要解析带有附加文件的主体(用于上传文件),您需要一个多部分解析器,而不仅仅是一个urlencoded的解析器: