我正在使用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
标记运行此标记以查看打印语句,则状态代码为200
,content
包含呈现的模板,包括"hi"
在上下文中。但context
为None
。
我认为client
与django.test.Client相同,应该让我看到背景......所以我错过了什么?
我已经尝试了this answer但是
了RuntimeError:setup_test_environment()已被调用,如果没有先调用teardown_test_environment(),则无法再次调用。
答案 0 :(得分:1)
在您提供的client link中,指出client
是django.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()
...