Hướng dẫn python requests mock multiple responses - Yêu cầu python giả lập nhiều phản hồi

Yêu cầu-Mock

Ghi chú

Các ví dụ trong việc sử dụng cú pháp này vì tạo phản hồi là một chức năng của bộ điều hợp chứ không phải là người chế giễu. Tất cả các đối số giống nhau có thể được cung cấp cho người chế giễu nếu đó là cách bạn sử dụng requests_mock trong dự án của mình và sử dụng

hình thức thay cho đã cho:

adapter.register_uri('GET', url, ...)

Nếu bạn không quen thuộc với các yêu cầu Bộ điều hợp (xem sử dụng bộ điều hợp), hãy thích cách tiếp cận giả (xem sử dụng bộ chế giễu).Adapter Usage), prefer the mocker approach (see Using the Mocker).

Đăng ký phản hồi Jo

Các phản hồi được đăng ký với hàm

>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
0 trên bộ điều hợp.

>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'

>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
1 lấy phương thức HTTP, URI và sau đó thông tin được sử dụng để xây dựng phản hồi. Thông tin này bao gồm:

status_code:Phản hồi trạng thái HTTP để trả lại. Mặc định là 200.
reason:Lý do văn bản đi kèm với trạng thái (ví dụ: OK OK trong ‘200 OK,)
headers:Một từ điển các tiêu đề được đưa vào phản hồi.
cookies:Một cookiejar chứa tất cả các cookie để thêm vào phản hồi.

Để chỉ định phần thân của phản hồi, có một số tùy chọn phụ thuộc vào định dạng mà bạn muốn trả về.

json:Một đối tượng Python sẽ được chuyển đổi thành chuỗi JSON.
text:Một chuỗi unicode. Đây thường là những gì bạn sẽ muốn sử dụng cho nội dung văn bản thông thường.
content:Một chuỗi byte. Điều này nên được sử dụng để bao gồm dữ liệu nhị phân trong các phản hồi.
body:Một tệp giống như đối tượng chứa hàm .Read ().
raw:Một
>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
2 được chuẩn bị trước.
exc:Một ngoại lệ sẽ được nêu ra thay vì trả lời phản hồi.

Các tùy chọn này được đặt tên trùng với các tham số trên đối tượng

>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
3. Ví dụ:

>>> adapter.register_uri('GET', 'mock://test.com/1', json={'a': 'b'}, status_code=200)
>>> resp = session.get('mock://test.com/1')
>>> resp.json()
{'a': 'b'}

>>> adapter.register_uri('GET', 'mock://test.com/2', text='Not Found', status_code=404)
>>> resp = session.get('mock://test.com/2')
>>> resp.text
'Not Found'
>>> resp.status_code
404

Nó chỉ có ý nghĩa để cung cấp nhiều nhất một yếu tố cơ thể cho mỗi phản ứng.

Phản hồi động

Một cuộc gọi lại có thể được cung cấp thay cho bất kỳ yếu tố cơ thể nào. Các cuộc gọi lại phải là một hàm dưới dạng

def callback(request, context):

và trả về một giá trị phù hợp với phần tử cơ thể đã được chỉ định. Các yếu tố được cung cấp là:

request:Đối tượng
>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
4 đã được cung cấp.
context:Một đối tượng chứa dữ liệu đã biết được thu thập về phản hồi này.

Các thuộc tính có sẵn trên ngữ cảnh là:

headers:Từ điển của các tiêu đề sẽ được trả lại trong phản hồi.
status_code:Mã trạng thái sẽ được trả về trong phản hồi.
reason:Mã trạng thái HTTP chuỗi lý do sẽ được trả về trong phản hồi.
cookies:Một
>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
5 cookie sẽ được hợp nhất vào phản hồi.

Các tham số này được điền ban đầu từ các biến được cung cấp cho hàm

>>> adapter.register_uri('GET', 'mock://test.com', text='Success')
>>> resp = session.get('mock://test.com')
>>> resp.text
'Success'
1 và nếu chúng được sửa đổi trên đối tượng ngữ cảnh thì những thay đổi đó sẽ được phản ánh trong phản hồi.

>>> def text_callback(request, context):
...     context.status_code = 200
...     context.headers['Test1'] = 'value1'
...     return 'response'
...
>>> adapter.register_uri('GET',
...                      'mock://test.com/3',
...                      text=text_callback,
...                      headers={'Test2': 'value2'},
...                      status_code=400)
>>> resp = session.get('mock://test.com/3')
>>> resp.status_code, resp.headers, resp.text
(200, {'Test1': 'value1', 'Test2': 'value2'}, 'response')

Danh sách trả lời

Nhiều câu trả lời có thể được cung cấp để được trả về theo thứ tự bằng cách chỉ định các tham số từ khóa trong danh sách. Nếu danh sách đã cạn kiệt thì phản hồi cuối cùng sẽ tiếp tục được trả lại.

>>> adapter.register_uri('GET', 'mock://test.com/4', [{'text': 'resp1', 'status_code': 300},
...                                                   {'text': 'resp2', 'status_code': 200}])
>>> resp = session.get('mock://test.com/4')
>>> (resp.status_code, resp.text)
(300, 'resp1')
>>> resp = session.get('mock://test.com/4')
>>> (resp.status_code, resp.text)
(200, 'resp2')
>>> resp = session.get('mock://test.com/4')
>>> (resp.status_code, resp.text)
(200, 'resp2')

Các cuộc gọi lại hoạt động trong danh sách phản hồi theo cách chính xác theo cách họ làm bình thường;

>>> adapter.register_uri('GET', 'mock://test.com/5', [{'text': text_callback}]),
>>> resp = session.get('mock://test.com/5')
>>> resp.status_code, resp.headers, resp.text
(200, {'Test1': 'value1', 'Test2': 'value2'}, 'response')

Tăng ngoại lệ

Khi cố gắng mô phỏng thời gian chờ kết nối hoặc SSLError, bạn cần có khả năng ném một ngoại lệ khi bị bắt. Điều này có thể đạt được bằng cách truyền tham số EXC thay vì tham số cơ thể.

>>> adapter.register_uri('GET', 'mock://test.com/6', exc=requests.exceptions.ConnectTimeout),
>>> session.get('mock://test.com/6')
Traceback (most recent call last):
   ...
ConnectTimeout:

Trong khi cookie chỉ là các tiêu đề mà chúng được đối xử theo một cách khác, cả trong HTTP và thư viện yêu cầu. Để làm việc chặt chẽ với thư viện yêu cầu càng tốt, có hai cách để cung cấp cookie cho các phản hồi yêu cầu_mock.

Phương pháp đơn giản nhất là sử dụng giao diện từ điển. Khóa và giá trị của từ điển được biến trực tiếp thành tên và giá trị của cookie. Phương pháp này không cho phép bạn đặt bất kỳ tham số cookie nâng cao nào hơn như hết hạn hoặc miền.

>>> adapter.register_uri('GET', 'mock://test.com/7', cookies={'foo': 'bar'}),
>>> resp = session.get('mock://test.com/7')
>>> resp.cookies['foo']
'bar'

Cách tiên tiến hơn là xây dựng và điền vào một cái lọ cookie mà bạn có thể thêm cookie và chuyển nó cho người chế giễu.

>>> jar = requests_mock.CookieJar()
>>> jar.set('foo', 'bar', domain='.test.com', path='/baz')
>>> adapter.register_uri('GET', 'mock://test.com/8', cookies=jar),
>>> resp = session.get('mock://test.com/8')
>>> resp.cookies['foo']
'bar'
>>> resp.cookies.list_paths()
['/baz']