You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用unittest.mock检测方法中是否调用了requests.get()

解决方案

首先你给出的代码存在两个小语法问题,先修正:

  1. MyClass的do_stuff是实例方法,第一个参数需要加self
  2. 测试类定义行末尾缺少冒号
    修正后的业务代码如下:
# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:57:01