最近对 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()
我成功地启动并运行了服务器,没有任何问题(除了 createServer 方法的警告 express 已被弃用,尽管这似乎不是困扰我的问题);但是当我运行测试时,assert 抛出一个异常表明测试失败,这显然不应该发生。
这是问题的截图
如果您仔细观察错误,似乎是在部分响应中附加的转义字符“\n”导致了问题。
我试图通过以下方式规避这个问题
- 尝试不同的相等性检查(equal、strictEqual 和 deepEqual)
- 从响应中删除 utf8 编码
但没有运气(除非我当然对字符串化测试数据执行相等性检查,针对返回的字符串化响应对象,其中格式已被手动删除)。
那么问题是,
- 为什么以上述方式格式化响应?仅仅是为了可读性吗?
- 假设不允许我删除格式,我该如何对刚收到的响应数据执行断言测试。
最佳答案
您从服务器获得的回复是一个 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"})
这可能是比将字符串与对象进行比较更明智的方法。
关于javascript - 对于通过快速 http 响应返回的 json 对象,NodeJS 'assert' 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12174567/