如何在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
相关产品推荐
相关产品推荐

