Я хотел бы провести модульное тестирование функции промежуточного программного обеспечения Express, которая, в свою очередь, использует node-formidable для обработки загрузка составного файла.
Вот надуманный пример:
function doUpload(req, res, next) {
const form = new formidable.IncomingForm();
form.uploadDir = this.mediaDir;
form.keepExtensions = true;
form.type = 'multipart';
form.multiples = true;
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
}
Этот код у меня работает при тестировании с Chrome и работающим приложением Express.
Я хочу, чтобы мой тестовый код выглядел так, как показано ниже, где я имитирую объект запроса, но я не могу понять, как имитировать объект запроса с данными формы. Грозный обратный вызов не срабатывает:
it(‘handles uploads’, (done) => {
const mockReq = http.request({
host: 'example.org',
});
mockReq.url = ‘/upload’;
const res = jasmine.createSpyObj('response', [ 'json', 'send', 'status', 'render', 'header', ‘redirect’, ‘end’, ‘write;]);
const next = jasmine.createSpy('next');
//*how to emulate a request with a multipart file upload)
doUpload(req, res, next);
res.write.and.callFake(done);
});
Я пробовал использовать библиотеку form-data, чтобы создать объект FormData и передать его в просьба, но не повезло, я не уверен, на правильном ли я пути или ухожу. Что-то вроде этого:
var form = new FormData();
const buff = fs.readFileSync(path.join(__dirname, '../fixtures/logo.png'));
form.append('file', buff, {
filename: 'logo.jpg',
contentType: 'image/png',
knownLength: buff.length
});
form.append('name', 'Logo');
req.headers = form.getHeaders();
form.pipe(req);
doUpload(req, res, next);