2012-11-08 2 views
3

J'ai essayé de tester mon application Flask qui utilise PyMongo. L'application fonctionne bien, mais quand j'exécute des tests unitaires, je reçois constamment un message d'erreur disant "travailler en dehors du contexte de l'application". Ce message est envoyé chaque fois que j'exécute un test unitaire nécessitant l'accès à la base de données Mongo.Flask MongoDB erreur: "travail en dehors du contexte de l'application"

J'ai suivi ce guide pour les tests unitaires: http://flask.pocoo.org/docs/testing/

conception de mon application est simple, similaire au tutoriel standard Flask.

Quelqu'un avait-il déjà le même problème?

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

Pourriez-vous poster un test unitaire afin que nous puissions y jeter un coup d'œil? – Talvalin

Répondre

5

J'ai finalement résolu le problème, qui était en raison du contexte d'application. Il semble que lorsque vous utilisez PyMongo, car il gère la connexion pour vous, l'objet de connexion doit être utilisé dans le même contexte qui a initialisé l'instance de PyMongo.

J'ai dû modifier le code, ainsi l'instance PyMongo est initialisée dans l'objet testable. Plus tard, cette instance est renvoyée via une méthode publique.

Ainsi, pour résoudre le problème, toutes mes demandes de base de données dans les tests unitaires doivent être exécutées sous l'instruction avec l'instruction. L'exemple suit

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

C'est vraiment une synthèse de cette énorme page de docs, merci – bcattle

Questions connexes