Тестирование колб: запросить тестовое приложение?

Во время разработки веб-разработки Flask Мигеля Гринберга я застрял во время тестирования кода на языке граватар,

def test_gravatar(self):
    u = User(email='john@example.com', password='cat')
    with self.app.test_request_context('/'):
        gravatar = u.gravatar()
        gravatar_256 = u.gravatar(size=256)
        gravatar_pg = u.gravatar(rating='pg')
        gravatar_retro = u.gravatar(default='retro')
    with self.app.test_request_context('/', base_url='https://example.com'):
        gravatar_ssl = u.gravatar()
    self.assertTrue('http://www.gravatar.com/avatar/' +
                    'd4c74594d841139328695756648b6bd6'in gravatar)
    self.assertTrue('s=256' in gravatar_256)
    self.assertTrue('r=pg' in gravatar_pg)
    self.assertTrue('d=retro' in gravatar_retro)
    self.assertTrue('https://secure.gravatar.com/avatar/' +
                    'd4c74594d841139328695756648b6bd6' in gravatar_ssl)

Что делает app.test_request_context() и чем он отличается от app_context()?

Почему нам даже нужно вызывать с помощью self.app.test_request_context('/')? Кроме того, какие изменения мы можем сделать, чтобы переместить вызов app.test_request_context() в SetUp()?

2 ответа

По этому предмету нужно много читать, поэтому начните с документации: app_context, test_request_context и вы всегда можете перепроверить код: app_context а также test_request_context, Кроме того, вот статья обсуждение контекста Flask.

Это много ссылок, поэтому для разбивки:

Мы это видим app_context создает новый контекст приложения, в то время как test_request_context создает новый контекст запроса. Контексты приложения создаются в двух ситуациях: вручную с app_context и когда создается контекст запроса, который, в свою очередь, создается с test_request_context или в начале запроса.

Поэтому, когда запрос поступает в ваше приложение, создается RequestContext. Создание этого объекта создает контекст приложения.

Зачем test_request_context? Вам нужен этот контекст для доступа к приложению при работе вне контекста, созданного запросом, например прокси, которые вы, вероятно, узнаете, например, current_app, request, g, а также session, Переходя к коду, когда вы создаете RequestContext с test_request_context вместо request_context, вы получаете EnvironBuilder объект.

Проверьте ответ tbicr здесь.

В частности, этот фрагмент кода

gravatar = u.gravatar()
gravatar_256 = u.gravatar(size=256)
gravatar_pg = u.gravatar(rating='pg')
gravatar_retro = u.gravatar(default='retro')

требует контекст запроса, так как ему необходим доступ к переменной request.

Для определения метода gravatar в пользовательской модели требуется переменная request.

def gravatar(self, size=100, default='identicon', rating='g'): 
        if request.is_secure: # here
            url = 'https://secure.gravatar.com/avatar' 
        else:  
            url = 'http://www.gravatar.com/avatar' 
        hash = self.avatar_hash or hashlib.md5(self.email.encode('utf-8')).hexdigest() 
        return '{url}/{hash}?s={size}&d={default}&r={rating}'.format(url=url, hash=hash, size=size, default=default, rating=rating)
Другие вопросы по тегам