【发布时间】: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