2016-01-24 39 views
1

为什么我的两个测试有冲突,我有点不知所措。一次测试中的补丁似乎坚持了另一次测试。如果我对修补测试发表评论,或者只是单独运行其他测试,则没有问题。我的测试是:补丁持续跨多个Django单元测试吗?

class TestUrlRouting(TestCase): 
    @patch('myapp.views.Home') 
    def test_home_url_routes_to_home_view(self, mock_home_view): 
     url = reverse('home') 
     match = resolve(url) 

     assert match.func == mock_home_view.as_view() 


class TestHomeView(TestCase): 
    def test_front_page_renders_home_template(self): 
     response = self.client.get('/') 
     self.assertTemplateUsed(response, 'home.html') 

随着Home视图是一个TemplateView。我最终的错误是:

Traceback (most recent call last): 
    File "/path/to/code/source/myapp/tests/test_views.py", line 11, in test_front_page_renders_home_template 
    response = self.client.get('/') 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/test/client.py", line 503, in get 
    **extra) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/test/client.py", line 304, in get 
    return self.generic('GET', path, secure=secure, **r) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/test/client.py", line 380, in generic 
    return self.request(**r) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/test/client.py", line 467, in request 
    six.reraise(*exc_info) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/utils/six.py", line 686, in reraise 
    raise value 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py", line 242, in get_response 
    response = self.apply_response_fixes(request, response) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/core/handlers/base.py", line 305, in apply_response_fixes 
    response = func(request, response) 
    File "/path/to/code/virtualenv/lib/python3.5/site-packages/django/http/utils.py", line 17, in conditional_content_removal 
    if 100 <= response.status_code < 200 or response.status_code in (204, 304): 
TypeError: unorderable types: int() <= MagicMock() 

因为我没有做什么特别的补丁装饰,我的猜测是,它有事情做与Django是如何设置的东西了。特别是,我发现补丁myapp.urls.Home不起作用。相反,我需要补丁myapp.views.Home,尽管被测线路在urls.pyurl(r'^$', Home.as_view(), name='home'),。任何想法,为什么这个补丁是持久的,我该如何解决它?非常感谢!

更新: 问题嘲讽myapp.views.Home.as_view,而不是仅仅myapp.views.Home时(再次,注意views是正确嘲笑的选项,而不是urls出于某种原因)仍然存在,甚至。

回答

0

对于.as_view()的调用在导入时只有一次(Django第一次需要访问“urls.py”),这就是为什么它是“持久化”的原因。

IMO您的第一个测试用例只是测试Django框架,而不是您自己的代码中的任何东西,除了主视图具有“home”的url名称。挑剔是不值得的。你可以很容易地覆盖reverse('home')在另一个你不需要模拟Django全局变量的测试用例中,你可以看到正确的视图。