使用pytest-django客户端的Dj​​ango响应上下文始终为None

时间:2017-08-10 18:06:09

标签: python django pytest-django

我正在使用pytest-django来测试一些Django视图。

我想测试响应上下文是否包含某些值,但它总是None

我的观点:

from django.views.generic import TemplateView

class MyView(TemplateView):
    template_name = 'my_template.html'

    def get_context_data(self, **kwargs):
        context = super(MyView, self).get_context_data(**kwargs)
        context['hello'] = 'hi'
        return context

我的测试:

def test_context(client):
    response = client.get('/test/')
    print('status', response.status_code)
    print('content', response.content)
    print('context', response.context)

如果我使用-s标记运行此标记以查看打印语句,则状态代码为200content包含呈现的模板,包括"hi"在上下文中。但contextNone

我认为clientdjango.test.Client相同,应该让我看到背景......所以我错过了什么?

我已经尝试了this answer但是

  

RuntimeError:setup_test_environment()已被调用,如果没有先调用teardown_test_environment(),则无法再次调用。

1 个答案:

答案 0 :(得分:1)

在您提供的client link中,指出clientdjango.test.Client的一个实例,所以实际上它并没有做任何特殊的事情,也不应该是一个问题。

您需要按照正确的说明设置环境 我们现在来看看错误:

来自setup_test_environment()源代码:

if hasattr(_TestState, 'saved_data'):
      # Executing this function twice would overwrite the saved values.
      raise RuntimeError(
          "setup_test_environment() was already called and can't be called "
          "again without first calling teardown_test_environment()."
)

这就是提升你RuntimeError以上的原因。

现在让我们看一下teardown_test_environment()方法:

...
del _TestState.saved_data

因此它删除了上述例外的罪魁祸首。

因此:

from django.test.utils import teardown_test_environment, setup_test_environment

try:
    # If setup_test_environment haven't been called previously this
    # will produce an AttributeError.
    teardown_test_environment()
except AttributeError:
    pass

setup_test_environment() 

...