2013-11-28 5 views
2

Я пытаюсь проверить API-интерфейс Flask, мне удалось свести к минимуму шаблон для каждого теста значительно, наследуя от класса шаблона, который охватывает соединения приложений и баз данных. Я не понял, как установить объект сеанса перед каждым тестом.Decorator

Я видел пример how to handle test sessions, но я хотел бы скрыть его в декораторе или в настройке класса unittest, если это возможно.

UnitTest установки Класс:

class TestingTemplate(unittest.TestCase): 

    @classmethod 
    def setUpClass(self): 
     """ Sets up a test database before each set of tests """ 
     setup_db('localhost', 28015, 'TEST', 
      datasets = test_dataset, 
      app_tables = test_tables) 
     self.rdb = rethinkdb.connect(
       host = 'localhost', 
       port = 28015, 
       db = 'TEST') 
     self.rdb.use('TEST') 
     app.config['RDB_DB'] = 'TEST' 
     self.app = app.test_client() 

В противном случае тест класс:

def admin_session(fn): 
    def run_test(self): 
     with self.app.session_transaction() as sess: 
      sess['role'] = 'admin' 
     fn(self) 
    return run_test 


class TestReview(template.TestingTemplate): 
    """ Tests the API endpoints associated with handling reviews. """ 


    @admin_session 
    def test_create_success(self): 
     """ Tests a successful review creation """ 
     # creating review 
     review = {'company': 'test', 'rating':10} 
     resp = self.app.post('/review/create/123', data=json.dumps(review)) 

     # testing creation 
     self.assertEqual(resp.status_code, 201) 
     resp_data = json.loads(resp.data) 
     self.assertEqual(resp_data['message'], 'review created') 

Ошибка брошено:

====================================================================== 
ERROR: test_create_success (test_reviews.TestReview) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/vagrant/src/server/testing/test_reviews.py", line 11, in run_test 
    with self.app.session_transaction() as sess: 
    File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__ 
    return self.gen.next() 
    File "/usr/local/lib/python2.7/dist-packages/flask/testing.py", line 74, in session_transaction 
    raise RuntimeError('Session backend did not open a session. ' 
RuntimeError: Session backend did not open a session. Check the configuration 

Любые идеи о том, как установить куки сессии перед каждым испытанием без двойной с заявлением шаблон?

+0

Предлагается разместить полный тестовый код, который не работает. Не только декоратор и строка Исключения. – akaRem

+0

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

ответ

2

Я склонен делать такого рода вещи с вспомогательным методом для замены прибудете/почтовые методы:

class MyTestCase(unittest.TestCase): 

    def request_with_role(self, path, method='GET', role='admin', *args, **kwargs): 
     ''' 
     Make an http request with the given role in the session 
     ''' 
     with self.app.test_client() as c: 
      with c.session_transaction() as sess: 
       sess['role'] = role 
      kwargs['method'] = method 
      kwargs['path'] = path 
      return c.open(*args, **kwargs) 

    def test_my_thing(self): 
     review = {'company': 'test', 'rating':10} 
     resp = self.request_with_role(
      '/review/create/123', 
      method='POST', 
      data=json.dumps(review), 
     ) 
     .... 

Вы также могли бы иметь что-то вроде request_as_user, который принимает ваш пользовательский объект и устанавливает сеанс правильно для этого пользователя:

session['_id'] = user.id 
session['role'] = user.role