3

我正在使用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"上下文中的那个。但是contextNone

我认为这与django.test.Clientclient相同,它应该让我看到上下文......所以我错过了什么?

我试过这个答案但得到了

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

4

1 回答 1

1

在您提供的客户端链接中,声明这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() 

...
于 2017-08-11T08:42:05.023 回答