2015-09-07 150 views
2

我正在为django视图编写测试,其中一些视图正在制作外部HTTP请求。在运行测试时,我不想执行这些HTTP请求。由于在测试期间,正在使用的数据是虚拟的,并且这些HTTP请求不会按预期运行。Django:从django视图进行测试时避免HTTP API调用

这可能是什么选择?

回答

1

这是嘲弄的用武之地。在你的测试,你可以使用库来修补代码要测试返回你所期望的测试结果的部分,绕过这是什么代码实际上做。

你可以在Python here上阅读一篇关于嘲讽的好博客文章。

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

如何模拟您正在进行的调用的具体细节取决于您的视图代码的外观。

+1

你分享的好文章,这可以用来模拟某些部分的代码。但没有得到如何Django视图可以作为整体进行测试。 – navyad

1

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

似乎并不完美的解决方案,通过了在应用程序代码堵塞这种情况下, – navyad

+0

你是对的,如果你这样做,是手动无处不在。但是,这就是继承进来的地方。我可能会创建一个自定义的基本视图,或者只是一个非常简单的mixin和一个基本的函数,它只是调用一个给定的URL来检查这些设置,然后在整个应用程序中使用该函数。如果你愿意,我可以告诉你看起来会是什么样子。 – electrometro

0

本是正确的,但这里有一些伪代码可能有帮助。此处的修补程序假定您使用的是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