2016-11-29 7 views
1

私はrethinkdbバックエンドを使用している私のフラスコアプリのunittestsを書いています。下記のように、新しい接続が開かれ、各要求の前と後に閉じている:ユニットテストrethinkdbフラスコアプリ、接続オーバーライド

@app.before_request 
def before_request(): 
    ARGS = settings.RETHINKDB_ARGS 
    try: 
     g.rdb_conn = rethinkdb.connect(host=ARGS['host'], 
           port=ARGS['port'], 
           db=ARGS['db']) 
    except RqlDriverError: 
     abort(503, "Database connection could be established.") 

@app.teardown_request 
def teardown_request(exception): 
    try: 
     g.rdb_conn.close() 
    except AttributeError: 
     pass 

私はUser.createは基本的に

r.table('user').insert(data).run(g.rdb_conn) 
を呼び出している各テストに

def setUp(self): 
     self.app = current_app.test_client() 
     self.user = User.create({ 
           'email': '[email protected]', 
           'first_name': 'a', 
           'last_name': 'a', 
           'role': 'user', 
           'status': 'active' 


          }) 

をデータベースレコードを作成しています

私のテスト機能:

def test_get(self): 

     url = url_for('api.get_user', **{'id': self.user.data.id}) 
     retval = ujson.loads(self.app.get(url).data) 
     ... 
def test_get2(self): 
     ... 

テストを実行、これは何が起こるかです:

  1. セットアップが初めて、g.rdb_conn = 1
  2. test_get実行を言って実行し、g.rdb_connは、オーバーライドg.rdb_conn = 2とされています要求が終了して終了しました。
  3. g.rdb_conn = 2のtest_get2で2回目のセットアップが実行されましたが、前の要求の最後に既に閉じています。
  4. "ReqlDriverError:Connection is closed。スローされた

どのように私は各テストの実行でお互いをオーバーライドするのを防ぐことができますか?

答えて

0

明らかに、私の問題はrethinkdbに直接関連していませんが、フラスコのグローバル変数は、要求が実行されるたびに変更されて上書きされています。

私は模擬ライブラリを使用して解決しました。

from mock import patch 
... 
rdb_conn = rethinkdb.connect(...) 

class Test(unittest.TestCase): 
... 
    @patch('flask.g.rdb_conn', rdb_conn) 
    def setUp(self): 
     functions that depend on g.rdb_conn... 
関連する問題