对于通过快速http响应返回的json对象,NodeJS'断言'测试失败

TWi*_*ckz 3 javascript serverside-javascript node.js

最近我开始对NodeJS感兴趣,最后我终于得到了一本NodeJS书.本书的一个简单示例是创建一个快速服务器并编写测试来验证作为练习的一部分公开的简单API.

请参考以下代码(我使用的是节点v0.8.8)

服务器(nodeExample.js)

     var express = require('express')
     var app = express.createServer()
     app.listen(8000)
     var msgs = []

     app.get('/', function(req, res) {
        res.send('Welcome to Node Twitter')
     })

     app.post('/send', express.bodyParser(), function(req, res) {
        if (req.body && req.body.tweet) {
           msgs.push(req.body.tweet)
           res.send({status:"ok", message:"Message received"})
        } else {
            res.send({status:"nok", message:"Message not received"})
        }
    })

    app.get('/tweets', function(req,res) {
    res.send(msgs)
    })
Run Code Online (Sandbox Code Playgroud)

考试

var http = require('http'),
assert = require('assert')
var opts = {
  host: 'localhost',
  port: 8000,
  path: '/send',
  method: 'POST',
  headers: {'content-type':'application/x-www-form-urlencoded'}
}

var req = http.request(opts, function(res) {
 res.setEncoding('utf8')
 var data = "";
res.on('data', function(d) {
  data += d
})
res.on('end', function() {
  assert.strictEqual(data, {status:"ok", message:"Message received"})
 })
})

req.write('tweet=test')
req.end()
Run Code Online (Sandbox Code Playgroud)

我设法使服务器启动并运行没有问题(除了警告说快速的createServer方法已被弃用,虽然似乎不是什么困扰我); 但是当我运行测试时,断言会抛出异常,表明测试失败,这显然不会发生.

这是问题的屏幕截图

在此输入图像描述

如果您仔细观察错误,似乎是响应部分中附加的转义字符"\n",这似乎是导致问题的原因.

我试图绕过这个问题

  1. 尝试不同的等式检查(相等,strictEqual和deepEqual)
  2. 从响应中删除utf8编码

但没有运气(除非我当然使用字符串化的测试数据执行相等检查,而对于已手动删除格式的字符串化响应对象).

所以问题是,

  1. 为什么响应以上述方式格式化?它只是为了可读性吗?
  2. 假设我不允许删除格式化,我如何对刚刚收到的响应数据执行断言测试.

Lin*_*iel 11

您从服务器获得的回复是JSON字符串:

'{
    "status": "ok",
    "message": "Tweet received"
}'
Run Code Online (Sandbox Code Playgroud)

您正在将此与对象进行比较:

{status:"ok", message:"Message received"}
Run Code Online (Sandbox Code Playgroud)

因为我收集你想断言你得到了正确的答复,我建议你JSON.parse先回复,并将这两个对象与assert.deepEqual以下内容进行比较:

assert.deepEqual(JSON.parse(data), {status:"ok", message:"Message received"})
Run Code Online (Sandbox Code Playgroud)

这可能比将字符串与对象进行比较更为明智.