Content-type header 在使用 supertest 测试 koa 路由时总是相同的
Content-type header is always the same while testing koa routes with supertest
我有一个使用 koa
和 koa-router
构建的应用程序。当使用 supertest
测试路由时,我遇到了一个问题,即 content-type
响应 header 总是 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();
});
});
测试失败的原因:
Error: expected "Content-Type" of "image/png", got "application/json; charset=utf-8"
at Test._assertHeader (node_modules/supertest/lib/test.js:215:12)
at Test._assertFunction (node_modules/supertest/lib/test.js:247:11)
at Test.assert (node_modules/supertest/lib/test.js:148:18)
at Server.assert (node_modules/supertest/lib/test.js:127:12)
at 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
header 会正确更改:
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');
都没有改变这种情况。
这是一个错误吗?有没有人遇到过同样的问题?
有几件事要尝试:
this.body = renderImage()
实际上是将body设置为null
还是undefined
?
查看 response object 的 Koa.js 代码时,如果 body 设置为 null
,koa 似乎正在删除 content-type
header或 undefined
.
renderImage()
的 return 值是 object 吗?如果是这样,它是缓冲区还是流?当设置 body
时,koa 会尝试检测 content-typeof 响应应该是什么。如果不是string
, Buffer
, 或者stream
, koa forces the content-type
header 是application/json
.
我有一个使用 koa
和 koa-router
构建的应用程序。当使用 supertest
测试路由时,我遇到了一个问题,即 content-type
响应 header 总是 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();
});
});
测试失败的原因:
Error: expected "Content-Type" of "image/png", got "application/json; charset=utf-8" at Test._assertHeader (node_modules/supertest/lib/test.js:215:12) at Test._assertFunction (node_modules/supertest/lib/test.js:247:11) at Test.assert (node_modules/supertest/lib/test.js:148:18) at Server.assert (node_modules/supertest/lib/test.js:127:12) at 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
header 会正确更改:
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');
都没有改变这种情况。
这是一个错误吗?有没有人遇到过同样的问题?
有几件事要尝试:
this.body = renderImage()
实际上是将body设置为null
还是undefined
?
查看 response object 的 Koa.js 代码时,如果 body 设置为 null
,koa 似乎正在删除 content-type
header或 undefined
.
renderImage()
的 return 值是 object 吗?如果是这样,它是缓冲区还是流?当设置 body
时,koa 会尝试检测 content-typeof 响应应该是什么。如果不是string
, Buffer
, 或者stream
, koa forces the content-type
header 是application/json
.