Чтение буферного потока/потока ответа с супертестом/суперагентом на сервере node.js
Я пытаюсь написать тест, который проверяет, выводит ли 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();
});
Ответы
Ответ 1
Развернувшись на ответе @Beau, для получения любого бинарного содержимого ответа в качестве буфера можно использовать следующее:
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();
});
});
Ответ 2
Я думаю, вы захотите создать свой собственный парсер для приложения /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();
});
Чтобы найти ответ на этот вопрос, я в основном полагался на проверку набора тестов суперагента.:)
Ответ 3
Существующие ответы не помогли мне. То, что я закончил, было:
// 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);
})