【发布时间】:2015-09-07 07:49:04
【问题描述】:
我正在为 django 视图编写测试,其中一些视图正在发出外部 HTTP 请求。在运行测试时,我不想执行这些 HTTP 请求。由于在测试期间,正在使用的数据是虚拟的,因此这些 HTTP 请求不会按预期运行。
对此有哪些可能的选择?
【问题讨论】:
标签: django django-testing
我正在为 django 视图编写测试,其中一些视图正在发出外部 HTTP 请求。在运行测试时,我不想执行这些 HTTP 请求。由于在测试期间,正在使用的数据是虚拟的,因此这些 HTTP 请求不会按预期运行。
对此有哪些可能的选择?
【问题讨论】:
标签: django django-testing
您可以覆盖测试中的设置,然后在视图中检查该设置。 Here 是覆盖设置的文档。
from django.conf import settings
if not settings.TEST_API:
# api call here
那么您的测试将如下所示
from django.test import TestCase, override_settings
class LoginTestCase(TestCase):
@override_settings(TEST_API=True)
def test_api_func(self):
# Do test here
因为到处都有这些会相当混乱,我建议创建一个看起来像这样的 mixin。
class SensitiveAPIMixin(object):
def api_request(self, url, *args, **kwargs):
from django.conf import settings
if not settings.TEST_API:
request = api_call(url)
# Do api request in here
return request
然后,通过多重继承的力量,你需要向这个api调用发出请求的视图你可以做类似的事情。
class View(generic.ListView, SensitiveAPIMixin):
def get(self, request, *args, **kwargs):
data = self.api_request('http://example.com/api1')
【讨论】:
Ben 是正确的,但这里有一些伪代码可能会有所帮助。此处的补丁假定您使用的是requests,但根据需要更改路径以模拟出您需要的内容。
from unittest import mock
from django.test import TestCase
from django.core.urlresolvers import reverse
class MyTestCase(TestCase):
@mock.patch('requests.post') # this is all you need to stop the API call
def test_my_view_that_posts_to_an_api(self, mock_get):
response = self.client.get(reverse('my-view-name'))
self.assertEqual('my-value', response.data['my-key'])
# other assertions as necessary
【讨论】: