python - httmock 在运行 tox 时不拦截 requests.send()

标签 python http python-requests

我正在使用来自 PyPI (https://pypi.python.org/pypi/httmock/) 的 httmock 来捕获 REST 请求并模拟它们。我将在我的单元测试代码中像这样使用它:

with httmock.HTTMock(my_request.token, my_request.put):
    payload = {'host-name': 'TestHost'}
    content = client.put_request('global/host-name',
                                  payload=payload)

作为 put_request() 的一部分,客户端类将看到没有身份验证 token ,并且将首先向带有用户和密码的 POST 请求获取 token ,然后执行 PUT 请求。有断言来检查过程的结果。

我有大量测试,当我使用 tox 运行它们时,这些测试工作正常。但是,如果我运行完整的 tox 测试套件,我将有大约 30 个测试失败。他们都无法完成身份验证。

我将调试添加到 httmock.py 文件的副本和客户端代码中。我看到的是,在 enter() 处,它接受 requests.Session.send 并保存它,如预期的那样替换为拦截函数。但是,我从来没有看到在这些失败的情况下调用了 _fake_send() (没有看到日志消息)。结果,它没有返回任何内容(不是 token )并且测试失败。

这里是我做的一些带注释的日志记录:

1 DEBUG [drivers.httmock] Have 2 handlers
2 DEBUG [drivers.httmock] Enter requests.sessions
3 DEBUG [client] Authenticating with 'localhost'
4 DEBUG [client] POST: Request for .../api/v1/auth/...
5 DEBUG [client] >>> module drivers.httmock
6 DEBUG [client] POST Took 0.00 seconds to process
7 DEBUG [client] POST: Completed [401]
8 ERROR [client] Failed authentication with localhost [401]

[1] 显示 with 子句注册了两个处理程序。 [2] 在上下文管理器的 dunder enter 中,requests.Session.send 指向正常的模块/函数。 [4] 是调用 requests.request() 之前的客户端。 [5] 显示 requests.Session.send 已经交换到 httmock。我原本希望在 [6] 看到 httmock 尝试处理程序的日志,但我看到的是显示调用已完成的客户端消息。

我查看了请求库,request() 创建了一个 session 并按预期调用了 session.Session.send()。

我不是很肯定,但我认为随着完整套件的运行,tox 将并行运行测试。

有人知道我哪里做错了吗?

最佳答案

发现 httmock 将 session.send() 替换为伪方法,该方法会尝试为上下文管理器定义的各种处理程序。

我的代码调用了 requests.request(),它创建了一个新的 session ,调用了 session.request(),它调用了 session.send(),并且模拟没有拦截 send() 调用。

我的猜测是因为如果使用 requests.* API,requests 会为每次调用启动一个新 session 。发现我的生产代码可以创建一个请求 session ,然后为每次调用使用相同的 session (并使用 session 的 request() 方法而不是 requests.request() 方法)。

一旦完成,这现在可以在完整的 tox 运行中运行,顺便说一下,它使用多个线程来运行测试方法(方法级别的线程)。

关于python - httmock 在运行 tox 时不拦截 requests.send(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109730/

相关文章:

java - 显示浏览器请求中未找到的页面

python - 将字典键作为参数传递给函数 python

python - 如何使用levenshtein函数删除pandas中的相似值

java - 从复选框值(数组)构建 URL Android

javascript - AngularJS undefined 不是一个函数

python - 使用请求/ session 后保存图像

Python 请求 - 客户端证书的 SSL 错误

python - 配置 Eclipse/PyDev 以使用我的虚拟机的 Python 解释器

python - 在 AWS Lambda 中连接 AWS RDS (psql)

python - 如何使用 {single key :multi values} 创建 HTTP 请求数据