web-dev-qa-db-ja.com

node.jsサーバーでsupertest / superagentを使用して応答出力バッファー/ストリームを読み取ります

APIルートが正しい内容のZipファイルを出力するかどうかをチェックするテストを作成しようとしています。

テストに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();
    });
20
ragulka

@Beauの回答を拡張すると、以下を使用して、バイナリ応答コンテンツをバッファとして取得できます。これは、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();
        });
});
29
rcoup

アプリケーション/ Zip用に独自のパーサーを作成し、それを使用して実際の応答データを取得することをお勧めします。たとえば、JSONパーサーは ここ です。それを取得したら、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();
  });

これに対する答えを見つけるために、私は主にスーパーエージェントテストスイートの検査に依存していました。 :)

1
Beau

既存の答えは私にはうまくいきませんでした。私がやったことは:

// parses response.body buffer into a data object
const parsePDF = response => {
  return new Promise((resolve, reject) => {
    // code that parses response.body as buffer
    // and calls resolve(data); when done
    // or reject(err); on error
  })
};

const binaryParser = require('superagent-binary-parser');

// test snippet
request(app)
    .get('/some/api/returning/pdf')
    .expect(200)
    .expect('content-type', 'application/pdf')
    .parse(binaryParser)
    .buffer()
    .then(parsePDF)
    .then((pdf) => {
      chai.expect(pdf.pages.length).to.be.equal(5);
    })
0
Edi