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

如何在Django视图测试中模拟外部API调用?

如何模拟Django视图中的外部API调用进行测试

要解决测试时调用真实API导致速度慢的问题,你可以用Python标准库的unittest.mock模块来模拟call_deepl_api函数的行为,以下是具体实现步骤:

1. 导入必要模块

在测试文件顶部添加mock相关导入:

from unittest.mock import patch

2. 修改测试代码(装饰器方式)

用@patch装饰器替换视图中调用的call_deepl_api函数,指定正确的路径并设置模拟返回值:

class TestOutput(SimpleTestCase):
    # 替换成你视图文件中call_deepl_api的实际引用路径
    @patch('your_app.views.call_deepl_api')
    def test_output_page_status_code_with_valid_data(self, mock_deepl):
        # 设置模拟API的返回结果
        mock_deepl.return_value = "Pollen dispersion information"
        
        # 发送POST请求
        response = self.client.post(
            reverse('home'),
            {'direction': 'Ja>En', 'source_text': '花粉飛散情報',}
        )
        
        # 验证响应状态码
        self.assertEqual(response.status_code, 200)
        # 验证API是否被传入正确参数调用
        mock_deepl.assert_called_once_with('花粉飛散情報', 'Ja', 'En')

3. 上下文管理器方式(适合setUp场景)

如果需要在setUp中复用模拟逻辑,可以用上下文管理器:

class TestOutput(SimpleTestCase):
    def setUp(self):
        # 替换成实际路径
        with patch('your_app.views.call_deepl_api') as mock_deepl:
            mock_deepl.return_value = "Pollen dispersion information"
            self.valid_data_response = self.client.post(
                reverse('home'),
                {'direction': 'Ja>En', 'source_text': '花粉飛散情報',}
            )

    def test_output_page_status_code_with_valid_data(self):
        self.assertEqual(self.valid_data_response.status_code, 200)

4. 扩展测试场景

还可以验证返回的模板内容是否包含模拟的翻译结果:

@patch('your_app.views.call_deepl_api')
def test_output_contains_translation(self, mock_deepl):
    mock_deepl.return_value = "Pollen dispersion information"
    response = self.client.post(
        reverse('home'),
        {'direction': 'Ja>En', 'source_text': '花粉飛散情報',}
    )
    # 验证页面是否包含翻译结果
    self.assertContains(response, "Pollen dispersion information")

关键注意事项

  • 路径正确性:patch的路径必须是视图函数中实际导入并使用call_deepl_api的路径,而非函数定义的路径。比如如果视图中是from .utils import call_deepl_api,则patch路径应为your_app.views.call_deepl_api。
  • 模拟返回值:根据测试场景设置不同的return_value,可以覆盖成功、异常等多种情况。
  • 调用验证:用assert_called_once_with、assert_called_with等方法,确保视图向API传入了正确的参数,验证业务逻辑的正确性。

内容的提问来源于stack exchange,提问作者shikamaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:47