2014-12-31 24 views
6

Khi tôi còn sơ khai yêu cầu với nock nó trả String kết quả thay vì Object ngay cả với 'Content-Type': 'application/json':Làm thế nào để trả về đối tượng thay vì chuỗi để trả lời bằng 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'); 

kiểm tra:

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

đầu ra:

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

Trong mã tôi sử dụng request mô-đun trả về Object với s dữ liệu ame. Tôi cũng đã thử sinon (không hoạt động đối với tôi) và fakeweb nhưng có cùng một vấn đề.

Mã của tôi, mà tôi đang cố gắng để kiểm tra:

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

Và nó sẽ trả về một đối tượng trong các yêu cầu thực.

PS. Tôi có thể thêm mã tiếp theo vào trình xử lý câu trả lời của mình:

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

Nhưng một số truy vấn trả về chuỗi xml và tôi không chịu trách nhiệm về những thay đổi đó.

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

kết quả tương tự.

Cập nhật:

tôi đọc một vài bài viết, sử dụng JSON Object, mà không cần phân tích nó (với Nock), vì vậy nó nên trả về đối tượng JSON, cùng cách như thế nào yêu cầu thư viện làm điều đó.

+0

nock trả về JSON. Để chuyển đổi thành Object, bạn cần chuyển đổi JSON thành Object bằng cách sử dụng 'JSON.parse' -> http://jsfiddle.net/5qaxtfz6/ –

+0

Tôi đã cập nhật câu trả lời của mình. [Yêu cầu] (https://github.com/request/request) mô-đun trả về một đối tượng – zishe

+0

Trong [câu hỏi này] (http://stackoverflow.com/questions/14689252/how-can-superagent-and-nock-work -tổng cộng) nó trả về một đối tượng. – zishe

Trả lời

6

Không có gì sai với cấu hình nock của bạn tuy nhiên bạn chưa nói với request để phân tích cú pháp phản hồi dưới dạng JSON.

Từ các tài liệu request method (nhấn mạnh vào tôi):

json - bộ cơ thể nhưng để JSON đại diện của giá trị và cho biết thêm Content-type: application/json tiêu đề. Ngoài ra, phân tích cú pháp nội dung phản hồi dưới dạng JSON.

Đối số callback được 3 đối số:

  • lỗi khi áp dụng (thường là từ http.ClientRequest đối tượng)
  • Một http.IncomingMessage đối tượng
  • Thứ ba là cơ quan phản ứng (String hoặc đệm, hoặc đối tượng JSON nếu tùy chọn json được cung cấp)

Vì vậy, bạn cần phải thiết lập các json tài sản để true trên đối tượng section.request của bạn :

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

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

Cảm ơn câu trả lời đầy đủ, tôi sẽ tặng một tiền thưởng khi nó được kích hoạt. – zishe

Các vấn đề liên quan