Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—如何在视图中模拟实例_Python_Django_Unit Testing_Mocking - Fatal编程技术网

Python—如何在视图中模拟实例

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

我正在测试我的视图,在将其发送到HttpResponse对象之前,我需要对上下文词典进行一些断言,以确保我的视图按照预期进行计算。但我怎么能断言呢?以下是我在视图中尝试执行的一个示例:

# 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
中的属性,因此它在您使用例如基于类的通用视图时可用。