2014-12-31 9 views
6

Когда я окурок запрос с nock он возвращает String результат вместо Object даже с 'Content-Type': 'application/json':Как вернуть объект вместо строки для ответа с помощью nock?

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'); 

проверки:

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

выход:

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

В коде я использую request модуль который возвращает Object с s ame данные. Я попробовал также sinon (не работает для меня) и fakeweb, но получил ту же проблему.

Моего код, который я пытаюсь тест:

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); 
}); 

И это возвращает объект в реальных запросах.

PS. Я мог бы добавить следующий код в мой обработчик ответа:

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

Но некоторые из запросов возвращает XML-строку, и я не несет ответственности за такие изменения.

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); 

же результаты.

Обновлено:

Я прочитал пару статей, которая использует JSON объект, без разбора его (с зарубки), поэтому он должен возвращает JSON объект, точно так же, как библиотека запроса сделать это.

+0

nock возвращает JSON. Чтобы преобразовать в Object, вам нужно преобразовать JSON в Object с помощью 'JSON.parse' -> http://jsfiddle.net/5qaxtfz6/ –

+0

Я обновил свой ответ. [Запрос] (https://github.com/request/request) возвращает объект – zishe

+0

В [этот вопрос] (http://stackoverflow.com/questions/14689252/how-can-superagent-and-nock-work -одно) возвращает объект. – zishe

ответ

6

Нет ничего плохого в вашей конфигурации нокаута, но вы не сказали request, чтобы разобрать ответ как JSON.

Из request method документации (выделено мной):

json - задает тело, но и в формате JSON представление значения и добавляет Content-Type: приложение/заголовок JSon. Кроме того, анализирует тело ответа как JSON.

аргумент обратного вызова получает 3 аргумента:

  • Произошла ошибка при необходимости (как правило, от http.ClientRequest объекта)
  • НТТР.IncomingMessage объект
  • Третье тело ответа (String или буфер, или объект JSON, если опция json поставляется)

Таким образом, вы должны установить json свойство true на вашем section.request объекте :

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

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

Спасибо за полный ответ, я награду щедростью, когда он будет включен. – zishe