Как выполнить юнит тест с загрузкой файла в мокко

У меня есть приложение, построенное на Express.js, и я хотел бы проверить функциональность загрузки файлов. Я пытаюсь воспроизвести объект, проанализированный в req.files (при использовании промежуточного программного обеспечения express.bodyParser). Как я могу это сделать?

Ответы на вопрос(7)

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();
              });
    });
});
 01 мар. 2015 г., 19:01
Когда я пытаюсь это сделать, req.files все еще не определен. Я использую bodyParser и никаких ошибок ENOENT для файла.

запросить обещание Вы можете просто сделать это, отправив formData встроен в него:

    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);
Решение Вопроса

но это немного сложно. Вот пример размещения изображения:

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

name Параметр Content-Disposition - это то, что ваш файл будет доступен через req.files (поэтому req.files.image для моего примера) Вы также можете использовать значение массива, например: name = & quot; images [] & quot; и ваши файлы будут доступны через массив, например: req.files.images [0]

Кроме того, если вы его еще не используете, вам следует взглянуть на это (что упрощает тестирование mocha / express): https://github.com/visionmedia/express/blob/master/test/support/http.js

Edit: Начиная с экспресс-3-бета5, экспресс использует супер-тест. Чтобы посмотреть старый код http.js, посмотрите здесь:https://github.com/visionmedia/express/blob/3.0.0beta4/test/support/http.js Или просто перейти к супер тесту ..

 03 июл. 2013 г., 03:57
.write был не определен

https://github.com/assaf/zombie создает виртуальный браузер для тестирования с основными функциями. Он может прикрепить файл к определенному полю ввода и поддерживает файлы cookie и сеансы

связанный суть:https://gist.github.com/764536

у с файлом req.files.file, который не определен.

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()
              });
    });
});
 19 авг. 2016 г., 20:35
@Name Game должен ли /path/to/file.jpg быть абсолютным путем на вашем компьютере разработчика, поэтому тест не переносится на другой компьютер? Спасибо.
 22 июн. 2016 г., 11:55
@AlexChin Да, спасибо. (Не помню как.)
 12 янв. 2016 г., 19:14
на самом деле не решить это для меня, до сих пор не получаюreq.files.file
 21 июн. 2016 г., 21:27
Вы когда-нибудь решали это @knutole?
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();
        });
    });

});

Ваш ответ на вопрос