我正在使用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"
。但context
是None
.
我认为这个client
与 django.test.Client 相同,它应该让我看到上下文......那么我错过了什么?
我已经尝试过这个答案,但得到了
运行时错误:setup_test_environment(( 已被调用,如果不先调用 teardown_test_environment((,则无法再次调用。
在您提供的客户端链接中,指出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()
...