2

Nodejs と Express を使用して例を進めています。しようとすると、エラーが発生します。

メインファイルの一部:

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

});

テスト スクリプトの一部:

    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":"Tweet received"}');
});

});

これはエラーです:

assert.js:104
  throw new assert.AssertionError({
        ^
AssertionError: "{\n  \"status\": \"ok\",\n  \"message\": \"Tweet received\"\n}" === "{\"status\":\"ok\",\"message\":\"Tweet received\"}"
    at IncomingMessage.<anonymous> (/home/jfb/Documents/Info/Nodejs/Up_and_Running/test.js:19:11)
    at IncomingMessage.EventEmitter.emit (events.js:115:20)
    at IncomingMessage._emitEnd (http.js:366:10)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23)
    at Socket.socketOnData [as ondata] (http.js:1356:20)
    at TCP.onread (net.js:404:27)

特殊文字を表示するように設定されたエディターでファイルをチェックしましたが、エラー メッセージに示されているように改行文字はありませんでした。

ここで何が起こっているのか誰か教えてください。

ありがとう、ジム

4

1 に答える 1

4

応答でオブジェクトを送信します。このオブジェクトは、Expressによって実際のJSON文字列にエンコードされます。どうやらExpressは、JSON文字列のフォーマットにインデントを追加しているようです。これは完全に有効です。アサーションは、JSON文字列が元のオブジェクトを定義する実際のJavascriptソースコードとまったく同じであることをテストします。Expressはオブジェクトのみを認識し、オブジェクトを生成するコードとそのコード内の無意味な空白の有無を確認できないため、これはJSONエンコーダーで保証できるものではありませんテストでは、実際にJSONをネイティブオブジェクトにデコードし、結果のオブジェクトを予想される状態を含む別のオブジェクトと深く比較する必要があります。もう1つのオプションは、実際に文字列を送信することです応答のオブジェクトの代わりに; このようにして、外部のJSONエンコーディングに依存せずに、応答の正確な文字列表現を制御できます。これは非常に柔軟性がなく、テストに関しては何も得られません。

于 2012-07-10T21:31:56.580 に答える