使用supertest测试koa路由时,Content-type标头始终相同

时间:2016-03-09 10:29:59

标签: javascript node.js koa supertest koa-router

我有一个使用koakoa-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();
      });
  });

测试失败的方式:

  

错误:“image / png”的预期“Content-Type”,得到“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');都没有改变这种情况。

这是一个错误吗?有没有人遇到同样的问题?

1 个答案:

答案 0 :(得分:2)

有几件事要尝试:

this.body = renderImage()实际上是将正文设置为null还是undefined? 查看response object的Koa.js代码时,如果正文设置为content-typenull,则koa会删除undefined标题。

renderImage()的返回值是一个对象吗?如果是这样,它是缓冲区还是流?设置body时,koa会尝试检测响应的内容类型。如果不是stringBufferstream,则content-type标题forcesapplication/json