Django:在从django视图进行测试时避免使用HTTP API调用

时间:2015-09-07 07:49:05

标签: django django-testing

我正在为django视图编写测试,一些视图正在进行外部HTTP请求。在运行测试时,我不想执行这些HTTP请求。因为在测试期间,正在使用的数据是虚拟的,并且这些HTTP请求将不会按预期运行。

可能的选择是什么?

2 个答案:

答案 0 :(得分:2)

您可以覆盖测试中的设置,然后在视图中检查该设置。 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')

答案 1 :(得分:1)

这是模拟的用武之地。在测试中,您可以使用库来修补正在测试的代码部分,以返回您期望的测试结果,绕过代码实际执行的操作。

你可以在Python here中阅读一篇关于模拟的好文章。

如果您使用的是Python 3.3或更高版本,则mock库将包含在Python中。如果没有,您可以从PyPI下载。

如何模拟您正在进行的调用的具体细节将取决于您的视图代码的确切内容。