getsentry / responses

A utility for mocking out the Python Requests library.
Apache License 2.0
4.13k stars 353 forks source link

Unable to debug `responses.post` not matching #730

Open jovlinger opened 2 months ago

jovlinger commented 2 months ago

Describe the bug

I am probably looking in the wrong place, but I am failing to find documentation on what to do when a matcher fails to match.

I have this code in my test

responses.activate
def test_test():
   responses.post(url=MY_URL, json={'some': 'response'})
   thread_run(mod.call_it)

and then in a different module mod

def call_it():
  responses.post(url=ALSO_MY_URL, headers=..., data=, timeout=)

but I don't get a match. Something is obviously wrong.

Are there any introspections I can do in call_it to ask what matchers have been attached and are active?

Or can I turn on verbose logging to see the thought process involved?

I don't even know how to ask if responses.activate is still active.

Additional context

No response

Version of responses

0.23.3

Steps to Reproduce

This was in the main text. This is not a bug report, but a request for help finding documentation.

Expected Result

I would like help finding the documentation that describes how to debug unexpected outcomes.

Actual Result

neither me or google can find any debugging or intospection documentation. I'd love to ask the system why it did or did not match a request.

I don't even know how to ask if responses.activate is still active.

markstory commented 1 month ago

 Are there any introspections I can do in call_it to ask what matchers have been attached and are active?

Use responses.registered() to get the list of registered mock responses. You'd have to look at each mock response individually to see which matchers are defined.

Or can I turn on verbose logging to see the thought process involved?

There is no additional logging that can be enabled. You may want to use assert_all_requests_are_fired=True in your responses.activate() call to get better error messages when response mocks are defined but not used.

If this logic is from your application code, the reason it isn't working is that you're using responses in application code. Instead your application should be using requests to send requests.


def call_it():
  responses.post(url=ALSO_MY_URL, headers=..., data=, timeout=)