In node.js, I have trouble making superagent and nock work together. If I use request instead of superagent, it works perfectly.
Here is a simple example where superagent fails to report the mocked data:
var agent = require('superagent');
var nock = require('nock');
nock('http://thefabric.com')
.get('/testapi.html')
.reply(200, {yes: 'it works !'});
agent
.get('http://thefabric.com/testapi.html')
.end(function(res){
console.log(res.text);
});
the res object has no 'text' property. Something went wrong.
Now if I do the same thing using request:
var request = require('request');
var nock = require('nock');
nock('http://thefabric.com')
.get('/testapi.html')
.reply(200, {yes: 'it works !'});
request('http://thefabric.com/testapi.html', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
})
The mocked content is displayed correctly.
We used superagent in the tests so I'd rather stick with it. Does anyone know how to make it work ?
Thank's a lot, Xavier
My presumption is that Nock is responding with
application/json
as the mime type since you're responding with{yes: 'it works'}
. Look atres.body
in Superagent. If this doesn't work, let me know and I'll take a closer look.Edit:
Try this:
or...
Either one works now. Here's what I believe is going on. nock is not setting a mime type, and the default is assumed. I assume the default is
application/octet-stream
. If that's the case, superagent then does not buffer the response to conserve memory. You must force it to buffer it. That's why if you specify a mime type, which your HTTP service should anyways, superagent knows what to do withapplication/json
and why if you can use eitherres.text
orres.body
(parsed JSON).