2012-04-03 40 views
1

Google App Engineの1.6.4 testbedを使用して、Google App Engineのテストベッドをインポートすることによって壊れ、特にFlask-Login 0.1パッケージ(sourceは)、私は、コマンドラインのユニットテストとの奇妙な問題が発生しています。フラスコ-ログインパッケージは<a href="http://flask.pocoo.org/" rel="nofollow">Flask</a> 0.8で

以下は、この問題を示す例です。コメント行(from google.appengine.ext import testbed)に注意してください。この行がコメントされると、テストは期待通りに機能します。

current_user.is_authenticated()のコメントアウトを解除すると、Flask-Login@login_requiredデコレータがログインユーザーの認識を停止します。つまり、current_user.is_authenticated()はFalseを返します。それは、犯人がtestbedをインポートしているようだ。

#!/usr/bin/env python2.7 
import unittest 
import sys 
from flask import Flask, current_app, url_for 
from flaskext import login 

sys.path.append('/usr/local/google_appengine') 

# Go ahead and uncomment this: 
# from google.appengine.ext import testbed 

app = Flask('test') 
app.secret_key = 'abc' 

login_manager = login.LoginManager() 
login_manager.setup_app(app) 
login_manager.login_view = 'index' 

class User(login.UserMixin): 
    def get_id(self): 
     return "1" 

@login_manager.user_loader 
def load_user(user_id): 
    return User() 

@app.route('/') 
@login.login_required 
def index(): 
    pass 

@login_manager.unauthorized_handler 
def unauthorized(): 
    raise Exception("Unauthorized.") 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     self.app = app 
     self.client = app.test_client() 

    def test_user(self): 
     with self.app.test_request_context(): 
      logged_in = login.login_user(User()) 
      r = self.client.get('/') 

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

特定の例外は次のとおりです。

ERROR:test:Exception on/[GET] 
Traceback (most recent call last): 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1504, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1264, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1262, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask-0.8-py2.7.egg/flask/app.py", line 1248, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask_Login-0.1-py2.7.egg/flaskext/login.py", line 479, in decorated_view 
    return current_app.login_manager.unauthorized() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Flask_Login-0.1-py2.7.egg/flaskext/login.py", line 250, in unauthorized 
    return self.unauthorized_callback() 
    File "./test.py", line 34, in unauthorized 
    raise Exception("Unauthorized.") 
Exception: Unauthorized. 

私が期待する行動がtestbedをインポート(および使用して)拡張により、フラスコ-ログインしまうフラスココンテキストスタックには影響しないとということですtestbedをインポートしても、単体テスト環境で作業を続けます。

私はこれを少しでも役に立たなかったので、この問題に対する潜在的な解決策についての洞察と示唆に感謝します。

ありがとうございます。

+0

回避策を見つけようとすると、「flask.g」と他の関連する変数も利用できないように見えました。 –

答えて

4

テストベッドは、データストアとユーザーサービスを含む多くのGAEサービスで別のスタブを使用します。

私はフラスコに慣れていませんが、ユーザがデータベースにログインする必要がある場合は、テストベッドが別のデータベースを使用するため失敗します。まず、テストベッドのデータベースにユーザーデータをロードする必要があります。

また、テストベッドを含める場合は、使用する前にスタブを設定するためにいくつかの初期化呼び出しがあります。 https://developers.google.com/appengine/docs/python/tools/localunittesting

+0

ありがとうございます。なぜテストベッドのスタブに言及していないのですか?ログインにはデータベースへのアクセスは必要ありません。上記縮退例では 'class User'と定義されています。前述したように、問題は 'testbed 'を使用していないが、' Flask-Login'を破棄するだけである。 –

+1

テストベッドのスタブがデフォルトのAPI動作を置き換えます。フラスコがデータストアを使用してセッションIDのようなものを保存していない場合は、他のAPIスタブのどれが何かに影響を及ぼしている可能性があるかどうかチェックしたいと思うでしょう。おそらくmemcache(私はフラスコがセッションを保存するためにmemcacheを使うかどうか分かりません)、あるいはおそらくurlfetchでしょう。どちらが責任を負っているかを見るには、ちょっとデバッグする必要があります。 – dragonx

+0

同意すると、テストベッドには何かが呼び出される必要があります。質問は何ですか。私はpdbの上から下に数回デバッグしましたが、ヒットしませんでした。問題はWerkzeugのどこかに埋もれているようです。私はその間に邪悪なサルのパッチを使いました。 :) –

関連する問題