【发布时间】:2013-11-28 17:45:12
【问题描述】:
我一直在尝试测试 Flask API,通过从涵盖应用程序和数据库连接的模板类继承,我能够显着减少每个测试的样板。我还没想通的是如何在每次测试之前设置一个会话对象。
我已经看过how to handle test sessions 的示例,但如果可能的话,我想将它隐藏在装饰器或单元测试类设置中。
单元测试类设置:
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
关于如何在每次测试之前设置会话 cookie 而不使用 double with 语句样板的任何想法?
【问题讨论】:
-
建议发布不起作用的完整测试代码。不仅仅是装饰器和异常字符串。
-
谢谢,我太仓促发了。我添加了与此测试相关的所有代码
标签: python unit-testing session testing flask