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

时间:2012-08-29 09:17:26

标签: javascript node.js serverside-javascript

最近我开始对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)
    })

测试

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()

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

以下是问题的截图

enter image description here

如果您仔细观察到错误,似乎是响应部分中附加的转义字符“\ n”,这似乎导致了问题。

我试图通过

规避这个问题
  1. 尝试不同的等式检查(等于,strictEqual和deepEqual)
  2. 从响应中删除utf8编码
  3. 但没有运气(除非我使用字符串化的测试数据执行相等性检查,而对于已手动删除格式的字符串化响应对象)。

    所以问题是,

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

2 个答案:

答案 0 :(得分:11)

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

'{
    "status": "ok",
    "message": "Tweet received"
}'

您将此与对象进行比较:

{status:"ok", message:"Message received"}

自从我收集到你想断言你得到了正确答复后,我建议你首先JSON.parse回复,并将这两个对象与assert.deepEqual进行比较:

assert.deepEqual(JSON.parse(data), {status:"ok", message:"Message received"})

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

答案 1 :(得分:1)

两件事:

res.on('end', function(){
  assert.deepEqual(JSON.parse(data), {"status": "ok", "message": "Tweet received"});
});

if (req.body && req.body.tweet) {
    tweets.push(req.body.tweet);
    console.log("success:" + req.body.tweet);
    res.send({"status": "ok", "message": "Tweet received"});
} else {...