2017-02-02 28 views
5

Tôi đang sử dụng mocha làm khung kiểm tra và tôi đang cố gắng giả lập yêu cầu DELETE sử dụng fetch đối với điểm kết thúc trả lại mã trạng thái HTTP 204.Nock chặn yêu cầu nhưng trả về đối tượng trống

Đây là mã kiểm tra:

it('should logout user', (done) => { 
    nock(<domain>) 
    .log(console.log) 
    .delete(path) 
    .reply(204, { 
     status: 204, 
     message: 'This is a mocked response', 
    }); 

    api.logout(token) 
    .then((response) => { 
     console.log('IS DONE?--->', nock.isDone()); 
     console.log('RESPONSE--->', response); 
     done(); 
    }) 
    .catch((error) => { 
     console.log('ERROR--->', error); 
    }); 
}); 

này trả về kết quả như sau:

matching <domain> to DELETE <domain>/<path>: true 
(the above line being generated by the .log method in nock) 
IS DONE?---> true 
RESPONSE---> {} 

Như bạn có thể thấy yêu cầu đã được chặn lại đúng như đã nêu bằng các phương pháp log()isDone() Nock, tuy nhiên đối tượng response được trả lại là một đối tượng trống, vì vậy không thể xác nhận về mã trạng thái HTTP trả lại (trong ví dụ này 204)

Bất kỳ ý tưởng nào tôi có thể bị thiếu ở đây ?, tại sao phương thức reply() trả về một đối tượng trống?

CẬP NHẬT

Đây là mã cho phương pháp logout, phương pháp remove là một wrapper cho một yêu cầu fetch sử dụng phương pháp DELETE HTTP.

logout(token) { 
    return remove(
    this.host, 
    END_POINTS.DELETE_TOKEN, 
    { 
     pathParams: { token }, 
    }, 
    { 
     Accept: 'application/json', 
     'Content-Type': 'application/json', 
     Authorization: `Bearer ${token}`, 
    }, 
); 
} 
+0

Mã 'api.logout' là gì? Điều đó dường như không được cung cấp bởi 'nock'. Dường như với tôi có thể có một lỗi ở đó. – Louis

+0

Nó đại diện cho phương thức 'DELETE'HTTP cho điểm kết thúc, hoạt động tốt và dường như bị chặn chính xác như được hiển thị trong đầu ra, tôi đã cập nhật câu hỏi để bao gồm mã, tôi chưa bao gồm nó trước để tránh nhầm lẫn. – rfc1484

Trả lời

1

Tôi nghĩ rằng 204 không có nghĩa vụ phải có một phản ứng body, vì vậy bạn có thể cần phải thay đổi nó thành 200. Các máy chủ tất nhiên có thể trở lại câu trả lời, nhưng tôi nghĩ rằng lấy sẽ không xử lý nó. Các gói khác như request sẽ xử lý cơ thể với 204 trạng thái, nhưng gói yêu cầu này chỉ dành cho phía máy chủ.

Cũng không chắc chắn trình bao bọc của bạn làm gì, nhưng tôi nghĩ bạn cần nhận được phản hồi bằng cách sử dụng lời hứa response.json(). Và mocha cũng có thể xử lý các lời hứa tự động, bạn chỉ có thể trả lại chúng. Xem ví dụ hoàn chỉnh dưới đây:

const nock = require('nock') 
const fetch = require('isomorphic-fetch'); 
const request = require('request') 

const domain = "http://domain.com"; 
const path = '/some-path'; 
const token = 'some-token'; 

const api = { 
    logout: (token) => { 
     return fetch(domain + path, { 
      method: 'DELETE', 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     }); 
    } 
} 

describe('something',() => { 
    it('should logout user with 204 response using request package', (done) => { 
     nock(domain) 
      .log(console.log) 
      .delete(path) 
      .reply(204, { 
       status: 204, 
       message: 'This is a mocked response', 
      }); 

     request.delete(domain + path, function(err, res) { 
      console.log(res.body); 
      done(err); 
     }) 
    }); 

    it('should logout user',() => { 
     nock(domain) 
      .log(console.log) 
      .delete(path) 
      .reply(200, { 
       status: 200, 
       message: 'This is a mocked response', 
      }); 

     return api.logout(token) 
      .then((response) => { 
       console.log('IS DONE?--->', nock.isDone()); 
       return response.json(); 
      }) 
      .then(function(body) { 
       console.log('BODY', body); 
      }) 
      .catch((error) => { 
       console.log('ERROR--->', error); 
      }); 
    }); 
}); 

Sản lượng này sẽ:

something 
matching http://domain.com:80 to DELETE http://domain.com:80/some-path: true 
{"status":204,"message":"This is a mocked response"} 
    ✓ should logout user with 204 response 
matching http://domain.com:80 to DELETE http://domain.com:80/some-path: true 
IS DONE?---> true 
BODY { status: 200, message: 'This is a mocked response' } 
    ✓ should logout user 

Sau DEPS sử dụng:

"dependencies": { 
    "isomorphic-fetch": "^2.2.1", 
    "mocha": "^3.2.0", 
    "nock": "^9.0.6", 
    "request": "^2.79.0" 
    } 

Tôi hy vọng nó giúp.

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