web-dev-qa-db-fra.com

Comment effectuer des tests unitaires avec un téléchargement de fichier dans Mocha

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?

26

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 ..

12
Jesper

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

});
9
Monica

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

Je viens de trouver ce module de TJ: https://github.com/visionmedia/supertest .

3

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

1
drinchev

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);
0
Jerry