httmock
httmock copied to clipboard
Mocked requests are more permissive with args, causing tests to pass when they should fail
I ran into this issue today, where everything worked in tests but failed when not mocked.
>>> import requests
>>> requests.post('http://example.com', 2.0)
TypeError: 'float' object is not iterable
Compare to
>>> import requests
>>> import httmock
>>> with httmock.HTTMock(lambda url, req: ''): requests.post('http://example.com', 2.0)
<Response [200]>
This is because 2.0 becomes the value of data
, which must be iterable in requests
, but can be anything in _fake_send
, Putting in a type check for data
would at least fix this (perhaps most common variant) even if it's not perfect
import requests
def custom_post(url, data=None, **kwargs):
# Check if data is provided and if it's iterable (e.g., a list or dictionary)
if data is not None and not isinstance(data, (list, dict)):
raise TypeError("data must be an iterable (e.g., list or dictionary)")
return requests.post(url, data=data, **kwargs)