3

最近 NodeJS に興味を持ち、ついに NodeJS の本を手に入れることができました。本の簡単な例は、Express サーバーを作成し、演習の一部として公開された単純な 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 の 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最初に回答を提案し、2 つのオブジェクトを次のように比較しますassert.deepEqual

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

これはおそらく、文字列をオブジェクトと比較するより賢明な方法です。

于 2012-08-29T09:55:51.480 に答える
1

2つのこと:

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 に答える