Python—如何在视图中模拟实例
我正在测试我的视图,在将其发送到HttpResponse对象之前,我需要对上下文词典进行一些断言,以确保我的视图按照预期进行计算。但我怎么能断言呢?以下是我在视图中尝试执行的一个示例:Python—如何在视图中模拟实例,python,django,unit-testing,mocking,Python,Django,Unit Testing,Mocking,我正在测试我的视图,在将其发送到HttpResponse对象之前,我需要对上下文词典进行一些断言,以确保我的视图按照预期进行计算。但我怎么能断言呢?以下是我在视图中尝试执行的一个示例: # some_app/views.py def my_view(request): context = RequestContext(request) if request.GET.get('something'): value = # calculate the value s
# 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)
我突然想到,也许我可以修补视图以获得上下文实例:
# 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'])
#一些_app/tests/unit/test_myview.py
从某些应用程序导入视图
从模拟导入补丁
从django.test.client导入请求工厂
类MyTest(测试用例):
def测试我的视图(自我):
request=RequestFactory().get('some_url',data={
“param1”:“a”,
“参数2”:“b”
})
使用补丁('some_app.views',[我在这里包括什么?])作为上下文:
#现在,应该是在视图中创建的上下文实例
响应=视图。我的视图(请求)
assertTrue(上下文['some_value']['value1'])
assertFalse(上下文['some_value']['value2'])
self.assertRaises(索引器、某些函数、,
上下文['some_value']['value1'])
但我想不出一个可行的办法:(
在我的测试中,是否有任何方法可以使我在视图中创建的上下文实例可用
谢谢你的帮助:)
p.S.在这种情况下,在浏览器中测试或检查生成的html不是一个选项:(您可以通过
响应来测试上下文。如果您使用的是TemplateResponse
,请尝试:
# 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'])
AttributeError:“HttpResponse”对象没有您有权使用的属性“context\u data”。context\u data
是TemplateResponse
中的属性,因此它在您使用例如基于类的通用视图时可用。