2016-11-29 35 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 

我對每個測試創建數據庫記錄

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' 


          }) 

User.create基本上呼籲

r.table('user').insert(data).run(g.rdb_conn) 

我的測試功能:

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是請求之後關閉結束第二次與g.rdb_conn = 2 test_get2
  3. 設置運行,但它在先前的請求
  4. 的端部已經關閉「ReqlDriverError:連接被關閉。」拋出

我怎樣才能防止在每次測試運行的連接重寫eachother?

回答

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...