如何使用unittest.mock检测方法中是否调用了requests.get()
解决方案
首先你给出的代码存在两个小语法问题,先修正:
MyClass的do_stuff是实例方法,第一个参数需要加self- 测试类定义行末尾缺少冒号
修正后的业务代码如下:
# my_class.py import requests class MyClass: def do_stuff(self, do_it=True): if do_it: requests.get('https://someapi.com')
核心思路
unittest.mock的核心规则是mock代码实际使用的导入位置:你的业务代码在my_class.py里导入了requests模块,所以你需要mock的是my_class.requests.get,而非根路径的requests.get。
完整测试代码
# test_my_class.py from django.test import TestCase from unittest.mock import patch from my_class import MyClass class TestMyClass(TestCase): @patch("my_class.requests.get") def test_do_stuff_uses_api_when_do_it_true(self, mock_get): # 调用业务方法 MyClass().do_stuff() # 断言get方法被调用恰好一次,且请求地址匹配 mock_get.assert_called_once_with("https://someapi.com") @patch("my_class.requests.get") def test_do_stuff_skips_api_when_do_it_false(self, mock_get): # 传入do_it=False调用 MyClass().do_stuff(do_it=False) # 断言get方法没有被调用 mock_get.assert_not_called()
如果你不想用装饰器写法,也可以用上下文管理器实现相同效果:
def test_do_stuff_uses_api(self): with patch("my_class.requests.get") as mock_get: MyClass().do_stuff() mock_get.assert_called_once_with("https://someapi.com")
常用mock断言说明
assert_called_once_with(*args, **kwargs):校验方法被调用恰好一次,且传入的参数完全匹配assert_not_called():校验方法从未被调用assert_called_with(*args, **kwargs):校验方法最后一次调用的参数匹配call_count属性:直接获取方法被调用的次数,可用于自定义断言
内容的提问来源于stack exchange,提问作者43Tesseracts
相关产品推荐
相关产品推荐

