2012-04-12 3 views
25

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

ответ

10

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

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

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

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

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

+0

.WRITE было определено – dianz

1

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

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

39

Вот пример того, как вы это сделаете с помощью модуля 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(); 
       }); 
    }); 
}); 
+3

Когда я пытаюсь это, req.files все еще не определено. Я использую bodyParser и никаких ошибок ENOENT для файла. –

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

}); 
3

Изменение присоедините ('изображение'), чтобы прикрепить файл ('') решит проблему 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('extra_info', '...') 
       .attach('file', 'path/to/file.jpg') 
       .end(function(err, res) { 
        res.should.have.status(200) // 'success' status 
        done() 
       }); 
    }); 
}); 
+0

на самом деле не решает это для меня, все еще не получая 'req.files.file' – knutole

+1

Вы когда-нибудь решали этот @knutole? –

+0

@AlexChin Да, спасибо. (Не помните, как это делается.) – knutole

Смежные вопросы