python-3.x - Python 使用 MagicMock 在 Pytest 测试中模拟两个函数
问题描述
这是我要测试的功能。
def service_request(url, session=configure_session()):
response = session.get(url)
document = json.loads(response.text)
return document
是的,它现在是基本的(你可能会争辩说几乎不值得测试),但如果我能让模拟工作,我将能够为其添加更多逻辑并在我进行时测试新添加的内容。我尝试了各种方法来模拟此测试中调用的另外两个函数。一个是configure_session
函数,另一个是库中的get
方法requests
。
该configure_session
函数构建requests.Session
配置有向服务发出请求所需的证书的对象。此方法还可以选择验证与 CA 捆绑包的 SSL 连接。在config
文件顶部导入的文件(未显示)检索环境变量并按预期工作。
def configure_session():
session = requests.Session()
session.cert = (config.client_cert, config.client_key)
if config.ssl_verify:
session.verify = config.ca_bundle
else:
session.verify = False
user_agent = f'{config.user_agent_version}'
session.headers.update({'User-Agent': user_agent,
'Accept': 'application/json'})
return session
这是我尝试过的最新代码。该load_fixture
方法是一种测试实用程序方法,并且按预期工作。
def test_request():
response_fixture = load_fixture('example_response.json')
mock_session = MagicMock()
mock_get = MagicMock()
mock_session.get.return_value = mock_get
mock_get.text.return_value = response_fixture
test_url = "https://url-for-test/with/the/path/here"
expected_headers = {
'Accept': 'application/json',
'User-Agent': 'test_user_agent_from_env_vars'
}
service_request(test_url, mock_session)
mock_session.get.assert_called_with(
test_url,
headers=expected_headers
)
assert response == response_fixture
当前的错误是 TypeError: the JSON object must be str, bytes or bytearray, not 'MagicMock'
。
解决方案
问题出在document = json.loads(response.text)
将 MagicMock 实例传递到json.loads()
.
这就是解决问题的方法。
mock_session = MagicMock()
mock_session.get.return_value.text = response_fixture
推荐阅读
- r - 问题 w。read.csv,错误消息:扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,:scan() 预期为“真实”,得到
- ios - 如果用户启用了缩放辅助功能,如何在 iOS 上识别?
- r - 具有多个二进制变量的相关矩阵
- c++ - 接受右值引用的函数,如果未指定顺序,如何使用它两次
- javascript - 带有 API / SDK 的磁条写入器 / 编码器?
- java - 将字符串添加到扫描仪中
- visual-studio - 如何增加 250 个事件的 Visual Studio 调试会话遥测限制?
- python - 找到最接近给定集合的 NumPy 向量的子向量?
- python - 转换为字符串json后无法加载字节Json
- azure - Terraform 是否具有 Azure ARM“完整”模式?