我正在为django视图编写测试,其中一些视图正在制作外部HTTP请求。在运行测试时,我不想执行这些HTTP请求。由于在测试期间,正在使用的数据是虚拟的,并且这些HTTP请求不会按预期运行。Django:从django视图进行测试时避免HTTP API调用
这可能是什么选择?
我正在为django视图编写测试,其中一些视图正在制作外部HTTP请求。在运行测试时,我不想执行这些HTTP请求。由于在测试期间,正在使用的数据是虚拟的,并且这些HTTP请求不会按预期运行。Django:从django视图进行测试时避免HTTP API调用
这可能是什么选择?
您可以覆盖测试中的设置,然后在视图中检查该设置。 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
因为这将是非常麻烦的有那些遍布我会建议创建一个混合会是这个样子的地方。
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')
似乎并不完美的解决方案,通过了在应用程序代码堵塞这种情况下, – navyad
你是对的,如果你这样做,是手动无处不在。但是,这就是继承进来的地方。我可能会创建一个自定义的基本视图,或者只是一个非常简单的mixin和一个基本的函数,它只是调用一个给定的URL来检查这些设置,然后在整个应用程序中使用该函数。如果你愿意,我可以告诉你看起来会是什么样子。 – electrometro
本是正确的,但这里有一些伪代码可能有帮助。此处的修补程序假定您使用的是requests
,但根据需要更改路径以嘲笑您需要的内容。
from unittest import mock
from django.test import TestCase
from django.core.urlresolvers import reverse
class MyTestCase(TestCase):
@mock.path('requests.post') # this is all you need to stop the API call
def test_my_view_that_posts_to_an_api(self):
response = self.client.get(reverse('my-view-name'))
self.assertEqual('my-value', response.data['my-key'])
# other assertions as necessary
你分享的好文章,这可以用来模拟某些部分的代码。但没有得到如何Django视图可以作为整体进行测试。 – navyad