我正在测试我的 View ,我需要在将上下文字典发送到 HttpResponse 对象之前对上下文字典进行一些断言,以确保我的 View 按预期进行计算。但是我怎么能断言呢?这是我试图在 View 中执行的操作的示例:
# some_app/views.py
def my_view(request):
context = RequestContext(request)
if request.GET.get('something'):
value = # calculate the value somehow
context.update(some_value=value)
elif request.GET.get('something_else'):
value = # calculate the value in other way
context.update(some_value=value)
# other stuff the view does
return render_to_response('some_template.html', context_instance=context)
我突然想到也许我可以修补 View 以获得上下文实例:
# some_app/tests/unit/test_myview.py
from some_app import views
from mock import patch
from django.test.client import RequestFactory
class MyTest(TestCase):
def test_my_view(self):
request = RequestFactory().get('some_url', data={
'param1': 'a',
'param2': 'b'
})
with patch('some_app.views', [WHAT DO I INCLUDE HERE?]) as context:
# by now, <context> should be the context instance created in the view
response = views.my_view(request)
self.assertTrue(context['some_value']['value1'])
self.assertFalse(context['some_value']['value2'])
self.assertRaises(IndexError, some_function,
context['some_value']['value1'])
但是我想不出一个可行的主意:(
有什么方法可以让我在 View 中创建的上下文实例在我的测试中可用?
感谢您的帮助:)
附言在这种情况下,在浏览器中测试或检查生成的 html 不是一个选项:(
最佳答案
如果您使用 TemplateResponse
,您可以通过 response.context_data
测试上下文。尝试:
# some_app/views.py
from django.template.response import TemplateResponse
def my_view(request):
context = {}
if request.GET.get('something'):
value = # calculate the value somehow
context.update(some_value=value)
elif request.GET.get('something_else'):
value = # calculate the value in other way
context.update(some_value=value)
# other stuff the view does
return TemplateResponse(request, 'some_template.html', context)
测试:
# some_app/tests/unit/test_myview.py
from some_app import views
from django.test.client import RequestFactory
class MyTest(TestCase):
def test_my_view(self):
request = RequestFactory().get('some_url', data={
'param1': 'a',
'param2': 'b'
})
response = views.my_view(request)
self.assertTrue(response.context_data['some_value']['value1'])
self.assertFalse(response.context_data['some_value']['value2'])
self.assertRaises(IndexError, some_function,
response.context_data['some_value']['value1'])
关于Python - 如何在 View 中模拟实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12289861/