Tuesday 15 January 2013

mocha - res.body is empty in this test that uses supertest and Node.js -



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