patrys / httmock

A mocking library for requests
Other
468 stars 57 forks source link

Mocked requests are more permissive with args, causing tests to pass when they should fail #39

Open furmaniak opened 8 years ago

furmaniak commented 8 years ago

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

ljluestc commented 9 months ago
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)