Получение текущего маршрута в тесте представления пирамиды

#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 варианта:

  1. Полностью имитируйте функцию для объекта запроса с версией current_route_path , которая возвращает то, что вы хотите. Например request.current_route_path = lambda *a, **kw: '/path' . Это здорово, если это не является предметом вашего теста.

  2. Извлеките IRoute объект из интроспектора и присоедините его к фиктивному запросу. Для этого требуется изучить API introspector, извлечь его оттуда и установить как request.matched_route = iroute_object .

  3. Используйте функциональный тест, который проходит через маршрутизатор, после чего Pyramid все правильно настроит для вас.