test node await async node.js zip mocha superagent supertest

await - Lea el búfer/flujo de salida de respuesta con supertest/superagent en el servidor node.js



supertest post (3)

Ampliando la respuesta de @Beau, se puede usar lo siguiente para obtener cualquier contenido de respuesta binario como un búfer que puede examinar más a fondo en 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(); }); });

Estoy tratando de escribir una prueba que verifique si una ruta API genera un archivo ZIP con el contenido correcto.

Estoy usando mocha y supertest para realizar pruebas, y me gustaría leer el flujo de salida / búfer, leer el contenido del archivo zip y ver si el contenido es correcto.

¿Alguna idea de cómo debo hacerlo? Cuando intento leer res.body , es solo un objeto vacío.

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(); });


Creo que querrá crear su propio analizador para aplicación / zip y usarlo para obtener los datos de respuesta reales; El analizador JSON está here , por ejemplo. Una vez que tengas eso, puedes usarlo pasándolo a request.parse; por lo que su prueba se convertiría en:

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(); });

Para encontrar la respuesta a esto, confié principalmente en inspeccionar el conjunto de pruebas de Superagent. :)


Las respuestas existentes no funcionaron para mí. Lo que terminé haciendo fue:

// 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); })