Заголовок Content-Type всегда один и тот же при тестировании koa-маршрутов с помощью супертеста.

У меня есть сборка приложения с koa и koa-router. При тестировании маршрутов с supertest я сталкиваюсь с проблемой, что заголовок ответа content-type всегда application/json; charset=utf-8.

const app = koa();
router
    .get('/img', function *(next) {
      this.type = 'image/png';
      // this.set('Content-Type', 'image/png'); 
      // this.set('content-type', 'image/png');
      this.body = renderImage();
    });

app
  .use(router.routes())
  .use(router.allowedMethods());


describe('Routes', () => {

  it('should handle /tiles/*/*/*/* requests', (done) => {
    request(http.createServer(app.callback()))
      .get('/img')
      .expect(200)
      .expect('Content-Type', 'image/png')
      .end(function (err, res) {
        console.log(res.res.headers);
        if (err) return done(err);

        expect(renderImage).to.be.called;
        done();
      });
  });

Как тест не проходит:

Ошибка: ожидался "Content-Type" "image/png", получено "application/json; charset=utf-8" в Test._assertHeader (node_modules/supertest/lib/test.js:215:12) в Test._assertFunction (node_modules/supertest/lib/test.js:247:11) в Test.assert (node_modules/supertest/lib/test.js:148:18) в Server.assert (node_modules/supertest/lib/test.js:127 :12) в emitCloseNT (net.js:1525:8)

Что регистрируется через console.log(res.res.headers):

{ 'content-type': 'application/json; charset=utf-8',
'content-length': '2',
date: 'Wed, 09 Mar 2016 10:15:37 GMT',
connection: 'close' }

Тем не менее, если я делаю запрос из браузера на указанный маршрут, заголовок content-type изменяется правильно:

Connection:keep-alive
Content-Length:334
Content-Type:image/png
Date:Wed, 09 Mar 2016 10:15:01 GMT

Ни this.set('Content-Type', 'image/png');, ни this.set('content-type', 'image/png'); ситуацию не меняют.

Это ошибка? Кто-нибудь сталкивался с такой же проблемой?


person Alexandr Lazarev    schedule 09.03.2016    source источник


Ответы (1)


Пара вещей, чтобы попробовать:

Действительно ли this.body = renderImage() устанавливает для тела значение null или undefined?
При просмотре кода Koa.js для объект ответа, похоже, что koa удаляет заголовок content-type, если для тела задано значение null или undefined.

Является ли возвращаемое значение renderImage() объектом? Если да, то это буфер или поток? Когда body установлен, koa пытается определить, каким должен быть тип содержимого ответа. Если это не string, Buffer или stream, коа форсирует заголовок content-type должен быть application/json.

person mikefrey    schedule 10.03.2016
comment
Спасибо! Я заглушил функцию renderImage, чтобы она возвращала пустой объект: ``renderImage: sinon.stub().returns({})`. Именно поэтому заголовок был удален. Странно, почему это не указано в характеристиках. - person Alexandr Lazarev; 10.03.2016