#python #testing #pyramid
#питон #тестирование #пирамида #python
Вопрос:
Я пытаюсь протестировать представление в пирамиде, которое использует request.current_route_path()
.
Я использую базовую настройку тестирования, в значительной степени прямо из документа:
from ..views.auth import signup
...
class ....:
def test_signup_view(self):
with testing.testConfig():
signup(testing.DummyRequest(self.session))
Я использую конфигурацию, аналогичнуюhttps://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/tests.html :
class BaseTest(unittest.TestCase):
def setUp(self) -> None:
self.config = testing.setUp(settings={
'sqlalchemy.url': self.postgresql.url().replace("postgresql", "postgresql pg8000", 1)
})
self.config.include('..models')
self.config.include('..routes')
...
но это приводит к ValueError: Current request matches no route
Я добавил path="/signup"
параметр к DummyRequest
, но в итоге получил ту же ошибку.
Мои маршруты основаны на uri, а не на ресурсах, поэтому конкретный маршрут для тестирования:
def includeme(config):
...
config.add_route('signup', '/signup')
...
Как мне обойти это?
Комментарии:
1. На какие документы вы ссылаетесь? Пожалуйста, предоставьте ссылку.
2. Также, пожалуйста, укажите конфигурацию вашего маршрута и то, как вы загружаете ее в свой
testing.testConfig
.3. @StevePiercy Я следую docs.pylonsproject.org/projects/pyramid/en/latest/tutorials /…
Ответ №1:
Это не очень просто смоделировать current_route_path
через DummyRequest
, потому что он полагается на IRoute
объект, прикрепленный к нему с именем, matched_route
которое он делает request.matched_route.name
, чтобы получить имя маршрута и, следовательно, метаданные, необходимые для генерации маршрута. Этот объект обычно подключается маршрутизатором, когда запрос фактически сопоставляется с маршрутом.
Я думаю, у вас есть 3 варианта:
-
Полностью имитируйте функцию для объекта запроса с версией
current_route_path
, которая возвращает то, что вы хотите. Напримерrequest.current_route_path = lambda *a, **kw: '/path'
. Это здорово, если это не является предметом вашего теста. -
Извлеките
IRoute
объект из интроспектора и присоедините его к фиктивному запросу. Для этого требуется изучить API introspector, извлечь его оттуда и установить какrequest.matched_route = iroute_object
. -
Используйте функциональный тест, который проходит через маршрутизатор, после чего Pyramid все правильно настроит для вас.