2012-11-26 8 views
17

APIルートが正しい内容のZIPファイルを出力するかどうかを確認するテストを作成しようとしています。node.jsサーバーでsupertest/superagentを使用して応答出力バッファ/ストリームを読み取る

私はテストのためにmochaとsupertestを使用していますが、実際には出力ストリーム/バッファを読み込み、zipファイルの内容を読み込み内容が正しいかどうか確認します。

どのようにすればいいですか? res.bodyを読み込もうとすると、空のオブジェクトに過ぎません。

request(app) 
    .get("/api/v1/orders/download?id[]=1&id=2") 
    .set("Authorization", authData) 
    .expect(200) 
    .expect('Content-Type', /application\/zip/) 
    .end(function (err, res) { 
     if (err) return done(err); 

     console.log('body:', res.body) 

     // Write the temp HTML file to filesystem using utf-8 encoding 
     var zip = new AdmZip(res.body); 
     var zipEntries = zip.getEntries(); 

     console.log('zipentries:', zipEntries); 

     zipEntries.forEach(function(zipEntry) { 
     console.log(zipEntry.toString()); // outputs zip entries information 
     }); 

     done(); 
    }); 

答えて

1

アプリケーション/ zip用の独自のパーサーを作成し、実際の応答データを取得するために使用したいと思うでしょう。たとえば、JSONパーサーはhereです。一度それを持っていれば、それをrequest.parseに渡すことで使用できます。

request(app) 
    .get("/api/v1/orders/download?id[]=1&id=2") 
    .set("Authorization", authData) 
    .expect(200) 
    .expect('Content-Type', /application\/zip/) 
    .parse(function (res, fn) { 
    res.data = ''; 
    res.on('data', function (chunk) { res.data += chunk; }); 
    res.on('end', function() { 
     try { 
     fn(null, new AdmZip(res.data)); 
     } catch (err) { 
     fn(err); 
     } 
    }); 
    }) 
    .end(function (err, res) { 
    if (err) return done(err); 

    console.log('body:', res.body) 

    // Write the temp HTML file to filesystem using utf-8 encoding 
    var zipEntries = res.body.getEntries(); 

    console.log('zipentries:', zipEntries); 

    zipEntries.forEach(function(zipEntry) { 
     console.log(zipEntry.toString()); // outputs zip entries information 
    }); 

    done(); 
    }); 

私は主に、スーパーエージェントテストスイートの検査に頼っていました。 :)

22

以下は、あなたがrequest.end()でさらに調べることができますバッファとして任意のバイナリレスポンスの内容を取得するために使用することができ、ボーの答え@上の拡大:

function binaryParser(res, callback) { 
    res.setEncoding('binary'); 
    res.data = ''; 
    res.on('data', function (chunk) { 
     res.data += chunk; 
    }); 
    res.on('end', function() { 
     callback(null, new Buffer(res.data, 'binary')); 
    }); 
} 

// example mocha test 
it('my test', function(done) { 
    request(app) 
     .get('/path/to/image.png') 
     .expect(200) 
     .expect('Content-Type', 'image.png') 
     .buffer() 
     .parse(binaryParser) 
     .end(function(err, res) { 
      if (err) return done(err); 

      // binary response data is in res.body as a buffer 
      assert.ok(Buffer.isBuffer(res.body)); 
      console.log("res=", res.body); 

      done(); 
     }); 
}); 
+1

これは素晴らしいですが、リクエストに '.buffer()'を追加する必要がありました。 – Nate

+0

[docs](http://visionmedia.github.io/superagent/#parsing-response-bodies)の@Nateでは、 "応答バッファリングが有効になっていない場合(.buffer(false))、応答イベントはボディパーザーが終了するのを待つことなく放出されるので、response.bodyは利用できません "。 – ZachB

+0

@ZachBだから '.buffer()。parse(binaryParser)'? – rcoup

-1

既存の答えは私のために動作しませんでした。私がやったことは、次のようになりました:

関連する問題