Ich habe eine App auf Express.js gebaut und ich möchte die Datei-Upload-Funktionalität testen. Ich versuche, das Objekt req.files zu analysieren (bei Verwendung von express.bodyParser Middleware). Wie kann ich das machen?Wie Unit-Test mit einem Datei-Upload in Mocha
Antwort
Sie diese direkt in Mokka tun können, aber es ist ein bisschen schwierig. Hier ist ein Beispiel, ein Bild schreibt:
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()
})
Die Name Parameter der Content-Disposition ist das, was Ihre Datei als über req.files zugänglich sein wird (so req.files.image für mein Beispiel) Sie können auch Verwenden Sie einen Array-Wert wie diesen: name = "images []" und Ihre Datei (en) wird über ein Array verfügbar sein, zB: req.files.images [0]
Auch wenn Sie es nicht bereits verwenden Sie sollten sich dies ansehen (macht Mokka/Express-Test ein bisschen einfacher): https://github.com/visionmedia/express/blob/master/test/support/http.js
Bearbeiten: Seit Express 3-Beta5 verwendet Express Supertest. Um Blick auf die alten http.js Code hier: https://github.com/visionmedia/express/blob/3.0.0beta4/test/support/http.js Oder einfach zu Supertest bewegen sich über ..
Sie könnten versuchen, zombie.js https://github.com/assaf/zombie verwenden, erstellt es einen virtuellen Browser zum Testen mit grundlegenden Funktionen. Es kann eine Datei in einem bestimmten Eingabefeld anhängen und unterstützt Cookies und Sessions
verwandten Kern: https://gist.github.com/764536
kam gerade über dieses Modul durch TJ: https://github.com/visionmedia/supertest.
Hier ist ein Beispiel, wie Sie es mit Supertest-Modul tun würden.
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();
});
});
});
Wenn ich dies versuche, ist req.files noch undefiniert. Ich verwende bodyParser und keine ENOENT-Fehler für die Datei. –
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();
});
});
});
befestigen ändern ('Bild') ('Datei') befestigen wird das Problem der req.files.file nicht definiert lösen.
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', '...')
.attach('file', 'path/to/file.jpg')
.end(function(err, res) {
res.should.have.status(200) // 'success' status
done()
});
});
});
.write war undefined – dianz