在我的python代码中,我有全局requests.session
实例:
import requests
session = requests.session()
如何使用Mock
模拟它?这种操作有装饰器吗?我试过以下:
session.get = mock.Mock(side_effect=self.side_effects)
但是(正如预期的那样)此代码在每次测试后都不会将session.get
返回到原始状态,例如@mock.patch
装饰器。
答案 0 :(得分:4)
使用mock.patch
修补模块中的会话。在这里,一个完整的工作示例https://gist.github.com/k-bx/5861641
答案 1 :(得分:1)
从前面的答案中得到一些灵感:
mock-attributes-in-python-mock
我能够模拟这样定义的会话:
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
答案 2 :(得分:0)
由于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'
答案 3 :(得分:0)
我发现了the requests_mock library。这省了我很多麻烦。有了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
类,该类命中端点以获取令牌以开始request.session。