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