Как утверждать, что django использует определенный шаблон в pytest

В стиле unittest я могу проверить, что страница использует определенный шаблон, вызвав assertTemplateUsed. Это полезно, например, когда Django вставляет значения через шаблон, так что я не могу просто проверить равенство строк.

Как мне написать эквивалентный оператор в pytest?

Я искал в pytest-django, но не вижу, как сделать это.


person Hatshepsut    schedule 28.08.2017    source источник
comment
Я не понимаю вашего вопроса, вы хотите проверить правильность отображения данных, которые вы передаете в шаблон?   -  person Agustin    schedule 28.08.2017
comment
@Augustin Нет, я хочу проверить, что когда я получаю страницу, она использует файл шаблона, который, как я ожидаю, она будет использовать.   -  person Hatshepsut    schedule 29.08.2017
comment
Если вы получаете страницу, то вы получаете шаблон, если нет, что вы подразумеваете под получением страницы? Не могли бы вы предоставить какой-то код, чтобы я мог вам помочь?   -  person Agustin    schedule 29.08.2017
comment
Код для assertTemplateUsed и _assert_template_used show есть атрибут .templates в reponse. Итак, вам нужно что-то вроде assert response.templates and ('mytemplate' in [t.name for t in response.templates if t.name is not None]).   -  person phd    schedule 29.08.2017


Ответы (3)


Как указано в комментарии phd, используйте следующее, чтобы подтвердить, что файл шаблона действительно используется в представлении:

response = client.get(article.get_absolute_url())
assert 'article_detail.html' in (t.name for t in response.templates)

Обновление: начиная с версии 3.8.0 (14 января 2020 г.) pytest-django делает все утверждения в TestCase Django доступными в pytest_django.asserts. В качестве примера см. ответ Стэна Редута.

person jnns    schedule 20.06.2018
comment
Это обходной путь, а не фактическое решение проблемы. - person Stan Redoute; 08.01.2021
comment
Почему ты это сказал? Это то, что Джанго делает в assertTemplateUsed(). Оберните это в функцию и все. Что еще вы хотите, чтобы это не было обходным путем? - person jnns; 10.01.2021
comment
Возможно, «обходной путь» был преувеличением, однако есть специальное утверждение, предоставленное pytest_django. - person Stan Redoute; 11.01.2021

Чтобы подтвердить, использовался ли данный шаблон для рендеринга определенного представления, вы можете (и даже должны) использовать помощники, предоставленные pytest-django:

import pytest
from pytest_django.asserts import assertTemplateUsed

...

def test_should_use_correct_template_to_render_a_view(client):
    response = client.get('.../your-url/')
    assertTemplateUsed(response, 'template_name.html')

pytest-django даже использует это точное утверждение в качестве примера в документации< /а>.

person Stan Redoute    schedule 24.06.2020

Если я правильно понимаю, вы хотите проверить, правильно ли Django отображает данные, которые вы передаете в шаблон. Если это так, то концепции неверны, вы должны сначала протестировать данные, собранные в вашем представлении, а затем убедиться, что оно вызывает шаблон. Проверка того, что шаблон содержит правильные данные, будет тестировать саму структуру Django.

person Agustin    schedule 28.08.2017