【问题标题】:How to test POST request parameters an Express app using supertest?如何使用 supertest 测试 Express 应用程序的 POST 请求参数?
【发布时间】:2014-04-15 06:07:35
【问题描述】:

我正在使用 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

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

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

【问题讨论】:

  • 你在使用快速正文解析器吗?
  • 不,我没有使用它。
  • 你的快递是什么版本的?
  • Express 4.0.0,我也用这个细节更新了这个问题。

标签: node.js http testing express supertest


【解决方案1】:

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

所以 express(实际上是 node.js http 服务器)将在收到 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 的:

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2019-06-16
    • 1970-01-01
    • 2020-11-24
    • 2015-05-14
    • 2020-02-15
    相关资源
    最近更新 更多