Python - 如何在 View 中模拟实例

标签 python django unit-testing mocking

我正在测试我的 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/

相关文章:

python - 如何有效地格式化类内部方法的输出?

python - 如何使用 python 在 OpenCv 中查找轮廓的颜色

python - Django:出于测试目的阻止互联网连接

python - 使用时间和日期对象分析数据

java - 如何在 ktor 应用程序中注入(inject)依赖项

Python Sendgrid 发送带有 PDF 附件的电子邮件

django - 无效的 pk(模型对象)不存在 - Django REST Framework

c# - Moq.Mock<T> 使用 MOQ 将表达式设置为 Mock 会导致模拟设置不匹配

python - 在 sqlalchemy select 对象中测试 where 子句

python - 使用 Python 3 和 Beautiful Soup 4 删除 HTML 标签并将抓取的数据保存到 CSV 文件