2013-05-13 7 views
12

Я тестирую приложение Flask (Flask 0.9), и, в частности, у меня есть сеансовое устройство, которое я бы хотел запустить в документальном режиме, что-то вроде этого (как я понимаю):Узел тестирования сеанса фляжки - не удается воспроизвести сбой с session_transaction

from flask import Flask, session 
app = Flask(__name__) 

@app.route('/', methods=['POST']) 
def m(): 
    logging.error(session) # expect {'x': 1} 
    return "" 

with app.test_request_context() as trc: 
    with app.test_client() as c: 
    with c.session_transaction() as sess: 
     sess['x'] = 1 
    c.post() 

Это работает, как ожидалось, а вывод что-то вроде этого:

ERROR:root:<SecureCookieSession {'x': 1}> 

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

ERROR:root:<SecureCookieSession {}> 

Эта проблема проявляется только при запуске с моего модуля тестирования модулей. Как бы то ни было, я не могу воспроизвести эту проблему с дегенеративным случаем, хотя я сделал довольно значительные усилия with a gist of some of this effort here. Главным моментом является то, что я включил itsdangerous и Google App Engine testbed, ожидая, что, возможно, одна из них была причиной.

В моей собственной системе я пошел дальше, чем gist, и почти полностью реплицировал мою модульную тестовую среду, пытаясь ее изолировать. Аналогичным образом, я удалил все увеличивающиеся количества соответствующего кода из моей системы тестирования. К моменту, я не могу думать о различиях между вырожденным случаем и моей урезанной структурой, которая могла бы повлиять на результат. Я прошел по вызову в pdb, чтобы попытаться выяснить причину этой злости, но еще не получить полезную информацию.

Что бы все сказать, я был бы благодарен за небольшое руководство или предложение относительно того, где может быть проблема. Что может повлиять на контекст Werkzeug таким образом, что session_transaction не соблюдается?

+0

Я знаю, что это был год, но я сам сталкиваюсь с этой проблемой. Вы когда-нибудь могли это понять? Согласно тому, что я читал в Интернете и в документах, это должно работать отлично. Но это не так. –

+0

@IanHunter Посмотрите на мой ответ ниже. Это может помочь. –

ответ

0

Вот что я в конечном итоге делает:

# Code that modifies the current `session`; we must be in a test context already. 
headers = {} 
with self.client.session_transaction(): 
    # Get the cookie that is sent to the browser to establish a connection 
    # via a fake request. 
    response = make_response() 
    self.app.session_interface.save_session(self.app, session, response) 
    headers['Cookie'] = response.headers.get('Set-Cookie', '') 
self.client.post(..., headers=headers) # also works for .get, .put, etc. 
0

Без тестового теста, который на самом деле терпит неудачу, трудно сказать много чего угодно. Все, о чем я могу думать, это то, что экземпляр TestClient, который вы используете, делает запрос отличным от того, который вы используете для настройки сеанса. Например. вы могли бы сделать сутью неудачу, как ожидается, с этим:

with self.app.test_client() as c: 
    with c.session_transaction() as sess: 
     sess['d'] = 1 
    self.client.post() 

Но это не тот случай, или суть, пойди разберись.

+0

Спасибо. У меня проблемы с пониманием того, что вы пытаетесь добавить здесь, Томми. Если вы заметили, что проблема сложная, я, конечно, согласен - следовательно, щедрость! ;) –

+1

Как я вижу, главная причина в том, что это сложно, потому что код, который вы отправили *, не прерывается *, как описано. Так что данный рабочий код все, что я могу сделать, это сделать обоснованное предположение о том, как заставить его потерпеть неудачу, как вы описали, и образец, который я разместил, выглядит так же хорошо, как и любой другой. Просто не делайте этого в реальном коде, и вы должны быть ближе к тому, чтобы что-то работать. –

3

В моем случае я автоматически ограничивал файлы cookie для определенного домена, загружая файл конфигурации. Обновляя конфигурацию «на лету», я смог получить файлы cookie для работы во время модульного тестирования. Установив свойство SESSION_COOKIE_DOMAIN на None, все домены (а именно localhost) смогли установить сеансы.

app.config.update(              
    SESSION_COOKIE_DOMAIN = None             
) 

Вы можете поиграться с настройками конфигурации, описанных в разделе Configuration Handling в документации.

1

Я ненавижу воскресить старый вопрос, но я считаю, что я понял, решение этой проблемы. Для тестирования, попробуйте установить имя сервера localhost:

app.config['SERVER_NAME'] = 'localhost' 

Я был первоначально используя хак Брайана, но это решило проблему для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^