【问题标题】:Patch persisting across multiple Django unit tests?补丁在多个 Django 单元测试中持续存在?
【发布时间】:2016-04-30 11:50:08
【问题描述】:

对于为什么我的两个测试相互冲突,我有点茫然。一个测试中的补丁似乎持续到另一个测试。如果我将补丁测试注释掉,或者只运行其他测试本身就没有问题。我的测试是:

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.py 中为url(r'^$', Home.as_view(), name='home'),。关于为什么这个补丁会持续存在以及如何修复它的任何想法?非常感谢!

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

【问题讨论】:

    标签: python django unit-testing python-3.x mocking


    【解决方案1】:

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

    IMO 您的第一个测试用例只是测试 Django 框架,而不是您自己的代码中的任何内容,除了主页视图的 url 名称为“home”。不值得那么挑剔。在另一个不需要模拟 Django 全局变量的测试用例中,您可以轻松覆盖 reverse('home') 让您获得正确的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2020-08-24
      • 2018-09-12
      • 2019-04-09
      • 2018-11-23
      相关资源
      最近更新 更多