使用 pytest-django 客户端的 Django 响应上下文始终是 None



我正在使用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标志运行它以查看 print 语句,则状态代码为200,并且content包含呈现的模板,包括上下文中的"hi"。但contextNone.

我认为这个client与 django.test.Client 相同,它应该让我看到上下文......那么我错过了什么?

我已经尝试过这个答案,但得到了

运行时错误:setup_test_environment(( 已被调用,如果不先调用 teardown_test_environment((,则无法再次调用。

在您提供的客户端链接中,指出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() 
...

最新更新