2014-12-31 21 views
6

Quando ho stub richiesta con nock esso restituisce String risultato invece di Object anche con 'Content-Type': 'application/json':Come restituire l'oggetto anziché la stringa per la risposta con la cocca?

var response = { 
    success: true, 
    statusCode: 200, 
    body: { 
    "status": "OK", 
    "id": "05056b27b82", 
    } 
}; 

Test.BuildRequest(); 
Test.SendRequest(done); 

nock('https://someapi.com') 
    // also tried 
    // .defaultReplyHeaders({ 
    // 'Content-Type': 'application/json', 
    // 'Accept': 'application/json' 
    // }) 

    .post('/order') 
    .reply(200, response.body, 
    'Content-Type': 'application/json', 
    'Accept': 'application/json'); 

controllo:

console.log(put.response.body); 
console.log(put.response.body.id); 

uscita:

{"status":"OK","id":"05056b27b82"} 
undefined 

Nel codice che utilizzo modulo request che restituisce Object con la s dati ami. Ho provato anche sinon (non funziona per me) e fakeweb ma ho avuto lo stesso problema.

Il mio codice, che sto cercando di prova:

var request = require('request'); 
// ... 

request(section.request, function (err, response, body) { 
    if (err || _.isEmpty(response)) 
    return result(err, curSyndication); 

    //if (_.isString(body)) 
    // body = JSON.parse(body); 

    section.response.body = body; 
    console.log(body.id); // => undefined (if uncomment previous code - 05056b27b82) 

    _this.handleResponse(section, response, body, result); 
}); 

e restituisce un oggetto nelle richieste reali.

PS. Potrei aggiungere il codice seguente nel mio gestore di risposta:

if (_.isString(body)) 
    body = JSON.parse(body); 

Ma alcuni di query restituisce stringa XML, e io non sono responsabile di tali modifiche.

Fakeweb:

fakeweb.registerUri({ 
    uri: 'https://someapi.com/order', 
    body: JSON.stringify({ 
    status: "OK", 
    id: "05056b27b82", 
    }), 
    statusCode: 200, 
    headers: { 
    'User-Agent': 'My requestor', 
    'Content-Type': 'application/json', 
    'Accept': 'application/json' 
    } 
}); 
Test.SendRequest(done); 

stessi risultati.

Aggiornato:

ho letto un paio di articoli, che utilizza JSON oggetto, senza analizzarlo (con la cocca), quindi dovrebbe restituisce oggetto JSON, allo stesso modo di come richiesta libreria di farlo.

+0

restituisce JSON. Per convertire in Object devi convertire il JSON in Object usando 'JSON.parse' -> http://jsfiddle.net/5qaxtfz6/ –

+0

Ho aggiornato la mia risposta. [Richiesta] (https://github.com/request/request) modulo restituisce un oggetto – zishe

+0

In [questa domanda] (http://stackoverflow.com/questions/14689252/how-can-superagent-and-nock-work -insieme) restituisce un oggetto. – zishe

risposta

6

Non c'è niente di sbagliato nella configurazione del nock, tuttavia non è stato detto a request di analizzare la risposta come JSON.

Dalla documentazione request method (enfasi su di me):

json - imposta corpo, ma a JSON rappresentazione del valore e aggiunge Content-type: application/intestazione JSON. Inoltre, analizza il corpo della risposta come JSON.

L'argomento callback ottiene 3 argomenti:

  • un errore se del caso (di solito da http.ClientRequest oggetto)
  • un HTTP.IncomingMessage opporsi
  • Il terzo è il corpo della risposta (String o tampone, o oggetto JSON se l'opzione json viene fornita)

quindi è necessario impostare la proprietà json per true sul tuo section.request oggetto :

var request = require('request'); 
// ... 

section.request.json = true; 
request(section.request, function (err, response, body) { 
    //.. 
}); 
+0

Grazie per la risposta completa, assegnerò un premio quando sarà abilitato. – zishe