J'ai une application construite sur Express.js et j'aimerais tester la fonctionnalité de téléchargement de fichier. J'essaie de reproduire l'objet analysé dans req.files (avec un middleware express.bodyParser). Comment puis-je faire ceci?
Vous pouvez le faire directement dans Mocha, mais c'est un peu compliqué. Voici un exemple affichant une image:
var filename = 'x.png'
, boundary = Math.random()
request(app)
.post('/g/' + myDraftGallery._id)
.set('Content-Type', 'multipart/form-data; boundary=' + boundary)
.write('--' + boundary + '\r\n')
.write('Content-Disposition: form-data; name="image"; filename="'+filename+'"\r\n')
.write('Content-Type: image/png\r\n')
.write('\r\n')
.write(fs.readFileSync('test/'+filename))
.write('\r\n--' + boundary + '--')
.end(function(res){
res.should.have.status(200)
done()
})
Le paramètre nom de Content-Disposition correspond à la manière dont votre fichier sera accessible via req.files (donc req.files.image pour mon exemple) Vous pouvez également utiliser une valeur de tableau comme celle-ci. : name = "images []" et votre fichier (s) sera disponible via un tableau, par exemple: req.files.images [0]
Aussi, si vous ne l'utilisez pas déjà, vous devriez jeter un coup d'œil à ceci (rend le test moka/express un peu plus facile): https://github.com/visionmedia/express/blob/ master/test/support/http.js
Edit : Depuis express 3-beta5, express utilise supertest. Pour consulter l'ancien code http.js, regardez ici: https://github.com/visionmedia/express/blob/3.0.0beta4/test/support/http.js Ou déplacez-vous simplement supertest ..
Voici un exemple de la façon dont vous le feriez avec le module Supertest.
var should = require('should'),
supertest = require('supertest');
var request = supertest('localhost:3000');
describe('upload', function() {
it('a file', function(done) {
request.post('/your/endpoint')
.field('extra_info', '{"in":"case you want to send json along with your file"}')
.attach('image', 'path/to/file.jpg')
.end(function(err, res) {
res.should.have.status(200); // 'success' status
done();
});
});
});
var expect = require('expect.js');
supertest = require('supertest');
var request = supertest('localhost:3000');
describe('create album', function () {
it('valid ', function (done) {
request.post('/albums')
.set('Authorization', 'Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.IjkxMTg3NTk1ODg2MCI.gq32xfcOhv5AiZXJup5al1DGG0piyGWnrjZ5NouauCU')
.field('Content-Type', 'multipart/form-data')
.field('name', 'moni')
.field('description', 'Nature+Pics')
.field('caption', 'nature')
.field('contacts', '["' + 911354971564 + '","' + 919092888819 + '"]')
.field('dimensions', '{"photo1":{"height": 10, "width": 10}, "photo2":{"height": 20, "width": 20}, "photo3":{"height": 20, "width": 20}, "photo4":{"height": 20, "width": 20}, "photo5":{"height": 20, "width": 20}}')
.attach('photo1', '/home/monica/Desktop/pic/1.jpeg')
.attach('photo2', '/home/monica/Desktop/pic/2.jpeg')
.attach('photo3', '/home/monica/Desktop/pic/3.jpeg')
.attach('photo4', '/home/monica/Desktop/pic/4.jpeg')
.attach('photo5', '/home/monica/Desktop/pic/5.jpeg')
.end(function (err, res) {
if (err) {
console.log(err);
} else expect(res.status).to.equal(200);
done();
});
});
});
Le fait de changer attach (image) en attachement (fichier) résoudra le problème de req.files.file non défini.
var should = require('should'),
supertest = require('supertest');
var request = supertest('localhost:3000');
describe('upload', function() {
it('a file', function(done) {
request.post('/your/endpoint')
.field({field1: 'xxx', field2: 'yyy'})
.attach('file', 'path/to/file.jpg')
.end(function(err, res) {
res.should.have.status(200) // 'success' status
done()
});
});
});
Je viens de trouver ce module de TJ: https://github.com/visionmedia/supertest .
Vous pouvez essayer d’utiliser zombie.js https://github.com/assaf/zombie , il crée un navigateur virtuel permettant de tester les fonctionnalités de base. Il peut attacher un fichier à un champ de saisie spécifique et prend en charge les cookies et les sessions.
gist connexes: https://Gist.github.com/764536
Si vous utilisez request promise vous pouvez simplement le faire, l’envoi de formData est intégré:
var options = {
method: 'POST',
uri: base + '/api/image/upload',
formData: {
someField: 'someValue',
anotherField: 'anotherValue',
file: {
// path to image
value: fs.createReadStream('./testImg.png'),
options: {
filename: 'testImg.png',
contentType: 'image/png'
}
}
}
};
let resp;
try {
resp = await request.post(options);
body = JSON.parse(resp);
} catch (e) {
console.log(e);
resp = e.response;
code = resp.statusCode;
body = JSON.parse(resp.body);
}
// access what is returned here, check what needs to be
assert.equal(code, 200, 'Status: ' + code + ': ' + body.error);
assert.equal(body.success, true);
assert.exists(body.image);