2012-11-08 38 views
3

我一直在嘗試使用PyMongo測試我的Flask應用程序。該應用程序工作正常,但是當我執行單元測試時,我經常會收到一條錯誤消息,說「在應用程序上下文之外工作」。每次運行任何需要訪問Mongo數據庫的單元測試時都會拋出此消息。Flask MongoDB錯誤:「在應用程序環境之外工作」

我一直在這個指南的單元測試如下: http://flask.pocoo.org/docs/testing/

我的應用程序的設計是直線前進,類似於標準瓶教程。

有沒有人有同樣的問題?

class BonjourlaVilleTestCase(unittest.TestCase): 
    container = {} 
    def register(self, nickname, password, email, agerange): 
     """Helper function to register a user""" 
     return self.app.post('/doregister', data={ 
      'nickname' : nickname, 
      'agerange' : agerange, 
      'password':  password, 
      'email':  email 
     }, follow_redirects=True) 


    def setUp(self):   
     app.config.from_envvar('app_settings_unittests', silent=True) 

     for x in app.config.iterkeys(): 
      print "Conf Key=%s, Value=%s" % (x, app.config[x]) 


     self.app = app.test_client() 

     self.container["mongo"] = PyMongo(app) 
     self.container["mailer"] = Mailer(app) 
     self.container["mongo"].safe = True 

     app.container = self.container 

    def tearDown(self): 
     self.container["mongo"].db.drop() 
     pass  

    def test_register(self): 
     nickname = "test_nick" 
     password = "test_password" 
     email = "[email protected]" 
     agerange = "1" 
     rv = self.register(nickname, password, email, agerange) 

     assert "feed" in rv.data 


if __name__ == '__main__':  
    unittest.main() 
+1

您可以發佈單元測試以便我們可以查看它嗎? – Talvalin

回答

5

我終於固定的問題,這是由於應用程序上下文。看起來,當使用PyMongo時,因爲它爲你管理連接,連接對象必須在初始化PyMongo實例的相同上下文中使用。

我不得不修改代碼,因此PyMongo實例在可測試對象中初始化。稍後,此實例通過公共方法返回。

因此,要解決這個問題,我所有在單元測試中的數據庫請求必須在聲明下執行。示例如下

with testable.app.app_context(): 
    # within this block, current_app points to app. 
    testable.dbinstance.find_one({"user": user}) 
+1

這是一個真正的綜合性文檔頁面,謝謝 – bcattle

相關問題