mocha - res.body is empty in this test that uses supertest and Node.js -
i testing node.js api supertest, , cannot explain why res.body
object superset returns empty. info shows in res.text
object, not res.body
, thought how prepare this?
i using express , body-parser
:
app.use(bodyparser.json()); app.use(bodyparser.json({ type: jsonmimetype })); app.use(bodyparser.urlencoded({ extended: true }));
here api method testing:
app.get(apipath + '/menu', function(req, res) { var expiration = getexpiration(); res.set({ 'content-type': jsonmimetype, 'content-length': jsontestdata.length, 'last-modified': new date(), 'expires': expiration, 'etag': null }); res.json({ items: jsontestdata }); }
here tests executing against api method:
describe('get /menu', function() { describe('http headers', function() { it('responds right mime type', function(done) { request(app) .get(apipath + '/menu') .set('accept', 'application/vnd.burgers.api+json') .expect('content-type', 'application/vnd.burgers.api+json; charset=utf-8') .expect(200, done); }); it('responds right expiration date', function(done) { var tomorrow = new date(); tomorrow.setdate(tomorrow.getdate() + 1); tomorrow.sethours(0,0,0,0); request(app) .get(apipath + '/menu') .set('accept', 'application/vnd.burgers.api+json; charset=utf-8') .expect('expires', tomorrow.toutcstring()) .expect(200, done); }); it('responds menu items', function(done) { request(app) .get(apipath + '/menu') .set('accept', 'application/vnd.burgers.api+json; charset=utf-8') .expect(200) .expect(function (res) { console.log(res); res.body.items.length.should.be.above(0); }) .end(done); }); }); });
the failure receive:
1) /menu http headers responds menu items: typeerror: cannot read property 'length' of undefined @ /users/brian/development/demos/burgers/menu/test/menuapitest.js:42:25 @ test.assert (/users/brian/development/demos/burgers/menu/node_modules/supertest/lib/test.js:213:13) @ server.assert (/users/brian/development/demos/burgers/menu/node_modules/supertest/lib/test.js:132:12) @ server.g (events.js:180:16) @ server.emit (events.js:92:17) @ net.js:1276:10 @ process._tickdomaincallback (node.js:463:13)
and finally, here excerpt of result of console.log(res)
:
... text: '{"items":[{"id":"1","name":"cheeseburger","price":3},{"id":"2","name":"hamburger","price":2.5},{"id":"3","name":"veggie burger","price":3},{"id":"4","name":"large fries","price":2},{"id":"5","name":"medium fries","price":1.5},{"id":"6","name":"small fries","price":1},{"id":"7","name":"large drink","price":2.5},{"id":"8","name":"medium drink","price":2},{"id":"9","name":"small drink","price":1}]}', body: {}, ...
based on next test expecting 'application/vnd.burgers.api+json; charset=utf-8' content-type:
request(app) .get(apipath + '/menu') .set('accept', 'application/vnd.burgers.api+json') .expect('content-type', 'application/vnd.burgers.api+json; charset=utf-8') .expect(200, done);
this express route shows setting header custom value, jsonmimetype:
app.get(apipath + '/menu', function(req, res) { var expiration = getexpiration(); res.set({ 'content-type': jsonmimetype, 'content-length': jsontestdata.length, 'last-modified': new date(), 'expires': expiration, 'etag': null }); res.json({ items: jsontestdata }); }
if case, supertest isnt going parse json automatically you. content-type header must start string 'application/json'. if cant create happen, have utilize json.parse function convert text string object.
supertest uses this file determine if sending json or not. under hood, supertest starts express server, makes 1 request via http, , shuts down. after http handoff, client side (which superagent) of http request doesnt know server configuration regard 'application/vnd.burgers.api+json; charset=utf-8'. know told via headers, in case, content-type.
also, did seek custom header on machine , got empty body.
edit: updated table link stated in comments
node.js mocha supertest
No comments:
Post a Comment