3

最近对 NodeJS 产生了兴趣,我终于设法拿到了一本 NodeJS 的书。书中的一个简单示例是创建一个快速服务器并编写一个测试来验证作为练习的一部分公开的简单 API。

请参考以下代码(我使用的是node 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()

我设法让服务器启动并运行没有问题(除了一个警告,即 express 的 createServer 方法已被弃用,尽管这似乎不是困扰我的问题);但是当我运行测试时,assert 会抛出一个异常,表明测试失败,这显然不应该发生。

这是问题的屏幕截图

在此处输入图像描述

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

我试图通过

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

但没有运气(除非我当然对字符串化的测试数据执行相等性检查,针对手动删除格式的返回的字符串化响应对象)。

所以问题是,

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

2 回答 2

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"})

这可能是比将字符串与对象进行比较更明智的方法。

于 2012-08-29T09:55:51.480 回答
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 {...
于 2013-09-14T17:30:51.777 回答