在我的 python 代码中,我有全局requests.session
实例:
import requests
session = requests.session()
我怎么能用它来模拟它Mock
?这种操作有装饰器吗?我试过以下:
session.get = mock.Mock(side_effect=self.side_effects)
但是(正如预期的那样)此代码session.get
在每次测试后都不会像@mock.patch
装饰器那样返回到原始状态。
在我的 python 代码中,我有全局requests.session
实例:
import requests
session = requests.session()
我怎么能用它来模拟它Mock
?这种操作有装饰器吗?我试过以下:
session.get = mock.Mock(side_effect=self.side_effects)
但是(正如预期的那样)此代码session.get
在每次测试后都不会像@mock.patch
装饰器那样返回到原始状态。
由于 requests.session() 返回 Session 类的实例,所以也可以使用 patch.object()
from requests import Session
from unittest.mock import patch
@patch.object(Session, 'get')
def test_foo(mock_get):
mock_get.return_value = 'bar'
用于mock.patch
修补模块中的会话。给你,一个完整的工作示例https://gist.github.com/k-bx/5861641
从先前的答案中得到一些启发,并且:
我能够模拟这样定义的会话:
class MyClient(object):
"""
"""
def __init__(self):
self.session = requests.session()
有了这个:(调用get返回一个status_code属性设置为 200 的响应)
def test_login_session():
with mock.patch('path.to.requests.session') as patched_session:
# instantiate service: Arrange
test_client = MyClient()
type(patched_session().get.return_value).status_code = mock.PropertyMock(return_value=200)
# Act (+assert)
resp = test_client.login_cookie()
# Assert
assert resp is None
我发现了 requests_mock 库。它为我省去了很多麻烦。使用 pytest...
def test_success(self, requests_mock):
"""They give us a token.
"""
requests_mock.get("https://example.com/api/v1/login",
text=(
'{"result":1001, "errMsg":null,'
f'"token":"TEST_TOKEN",' '"expire":1799}'))
auth_token = the_module_I_am_testing.BearerAuth('test_apikey')
assert auth_token == 'TEST_TOKEN'
我正在测试的模块有我的BearerAuth
类,它会到达一个令牌的端点以启动 requests.session。