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

如何在Django应用测试中模拟调用外部API的组件?

模拟外部API调用进行单元测试

这绝对是单元测试里的高频需求——谁也不想让测试用例依赖外部服务的状态,还可能产生额外的API调用成本对吧?针对你的代码场景,我给你推荐几种Python里最常用的模拟方案:

首先先把你的示例代码贴出来方便参考:

def create_animals(candidate):
    if ExternalService.get_candidate_validity(candidate):
        print('Things are good, go ahead')
        # 创建动物对象等操作……

方案一:用Python标准库unittest.mock.patch(无需额外安装)

这是官方推荐的做法,直接用标准库就能搞定,不管你用unittest还是pytest都支持。

核心思路是用patch装饰器(或者上下文管理器)替换掉你要模拟的外部API方法,然后指定它的返回值,这样测试时就不会触发真实调用了。

举个完整的测试例子(用unittest框架):

from unittest.mock import patch
import unittest
# 导入你的模块和方法
from your_module import create_animals, ExternalService

class TestCreateAnimals(unittest.TestCase):
    @patch('your_module.ExternalService.get_candidate_validity')
    def test_create_animals_when_candidate_valid(self, mock_validity_check):
        # 模拟API返回True的场景
        mock_validity_check.return_value = True
        
        # 调用要测试的函数
        create_animals("valid_candidate_123")
        
        # 验证外部方法被正确调用了一次,参数符合预期
        mock_validity_check.assert_called_once_with("valid_candidate_123")
        # 这里还可以添加后续逻辑的断言,比如检查动物对象是否被正确创建、相关操作是否执行

    @patch('your_module.ExternalService.get_candidate_validity')
    def test_create_animals_when_candidate_invalid(self, mock_validity_check):
        # 模拟API返回False的场景
        mock_validity_check.return_value = False
        
        create_animals("invalid_candidate_456")
        
        # 验证方法被调用,同时可以断言后续的创建逻辑没有执行(比如检查print输出、对象是否存在)
        mock_validity_check.assert_called_once_with("invalid_candidate_456")

⚠️ 重要提醒:patch的参数必须是你的测试模块中引用ExternalService的完整路径。比如如果create_animals在animal_service.py里,而这个文件里导入了ExternalService,那路径就是animal_service.ExternalService.get_candidate_validity,别写错了,不然模拟会不生效。

方案二:用pytest的monkeypatch fixture(适合pytest用户)

如果你平时用pytest写测试,monkeypatch fixture也是个很方便的选择,它可以动态替换对象的属性。

示例代码:

import pytest
from your_module import create_animals, ExternalService

def test_create_animals_valid_candidate(monkeypatch):
    # 定义一个模拟函数,替代原API方法
    def mock_get_validity(candidate):
        return True
    
    # 替换ExternalService的get_candidate_validity方法
    monkeypatch.setattr(ExternalService, 'get_candidate_validity', mock_get_validity)
    
    # 执行测试
    create_animals("valid_test_candidate")
    
    # 添加断言逻辑,比如验证后续操作是否执行

def test_create_animals_invalid_candidate(monkeypatch):
    def mock_get_validity(candidate):
        return False
    
    monkeypatch.setattr(ExternalService, 'get_candidate_validity', mock_get_validity)
    
    create_animals("invalid_test_candidate")
    
    # 断言后续创建逻辑未执行

额外小贴士

  • 除了模拟返回值,你还可以模拟API抛出异常的场景(比如mock_validity_check.side_effect = Exception("API down")),这样能测试你的代码在外部服务故障时的处理逻辑
  • 测试时一定要验证模拟方法的调用情况(比如assert_called_once_with),确保你的测试用例确实覆盖了对应的代码分支

内容的提问来源于stack exchange,提问作者Stupid.Fat.Cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:22