4

PyMongo を使用する Flask アプリケーションをテストしようとしています。アプリケーションは正常に動作しますが、単体テストを実行すると、「アプリケーション コンテキスト外で動作しています」というエラー メッセージが常に表示されます。このメッセージは、Mongo データベースへのアクセスを必要とする単体テストを実行するたびにスローされます。

単体テストについては、このガイドに従っています: http://flask.pocoo.org/docs/testing/

私のアプリケーションの設計は、標準の Flask チュートリアルと同様に単純です。

誰かがすでに同じ問題を抱えていましたか?

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    = "test@email.com"
        agerange = "1"
        rv = self.register(nickname, password, email, agerange)

        assert "feed" in rv.data


if __name__ == '__main__':    
    unittest.main()
4

2 に答える 2

5

アプリケーションのコンテキストが原因であった問題を最終的に修正しました。PyMongo を使用する場合、接続を管理するため、PyMongo インスタンスを初期化したのと同じコンテキスト内で接続オブジェクトを使用する必要があるようです。

コードを変更する必要があったため、PyMongo インスタンスはテスト可能なオブジェクトで初期化されます。後で、このインスタンスはパブリック メソッドを介して返されます。

したがって、問題を解決するには、単体テストのすべての DB リクエストを withステートメントで実行する必要があります。例は次のとおりです

with testable.app.app_context():
    # within this block, current_app points to app.
    testable.dbinstance.find_one({"user": user})
于 2012-11-12T09:14:03.373 に答える
1

Context Locals と test_request_context() を確認してください: http://flask.pocoo.org/docs/quickstart/#context-locals

于 2012-11-09T00:02:13.847 に答える