Как получить uri_for с webapp2 в модульном тесте? - PullRequest
10 голосов
/ 17 сентября 2011

Я пытаюсь выполнить модульное тестирование обработчика с webapp2 и сталкиваюсь с тем, что должно быть просто глупой маленькой ошибкой.

Я бы хотел использовать в тесте webapp2.uri_forно я, кажется, не могу этого сделать:

    def test_returns_200_on_home_page(self):
        response = main.app.get_response(webapp2.uri_for('index'))
        self.assertEqual(200, response.status_int)

Если я просто сделаю main.app.get_response('/'), все будет работать отлично.

Получено исключение:

   Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 318, in run
    testMethod()
  File "tests.py", line 27, in test_returns_200_on_home_page
    webapp2.uri_for('index')
  File "/Users/.../webapp2_example/lib/webapp2.py", line 1671, in uri_for
    return request.app.router.build(request, _name, args, kwargs)
  File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 173, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 136, in _get_current_object
    raise RuntimeError('no object bound to %s' % self.__name__)
RuntimeError: no object bound to request

Есть какие-то глупые настройки, которые мне не хватает?

Ответы [ 2 ]

14 голосов
/ 18 сентября 2011

Я думаю, что единственный вариант - установить фиктивный запрос, чтобы можно было создать URI для теста:

def test_returns_200_on_home_page(self):
    // Set a dummy request just to be able to use uri_for().
    req = webapp2.Request.blank('/')
    req.app = main.app
    main.app.set_globals(app=main.app, request=req)

    response = main.app.get_response(webapp2.uri_for('index'))
    self.assertEqual(200, response.status_int)

Никогда не используйте set_globals() вне испытаний. Вызывается приложением WSGI для установки активного приложения и запроса в поточно-ориентированном режиме.

0 голосов
/ 18 сентября 2011

webapp2.uri_for() предполагает, что вы находитесь в контексте веб-запроса, и происходит сбой, поскольку он не может найти объект request.

Вместо того, чтобы обойти это, вы можете рассматривать свое приложение как черный ящик иназывайте его, используя буквенные URI, например '/', как вы упомянули.В конце концов, вы хотите смоделировать обычный веб-запрос, и веб-браузер также будет использовать URI, а не внутренние ярлыки маршрутизации.

...