2012-04-03 129 views
1

當使用谷歌應用程序引擎1.6.4 testbedFlask 0.8斷裂,且特別是0.1 Flask-Login包(source),I遇到命令行的單元測試一個奇怪的問題。燒瓶登錄包通過導入谷歌應用程序引擎的測試臺

下面是一個演示問題的例子。請注意註釋行(from google.appengine.ext import testbed)。當該行被評論時,測試按預期工作。

當該行被取消註釋時,@login_requiredFlask-Login的裝飾器停止識別登錄用戶,即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'和其他相關變量似乎也不可用。 – 2012-04-03 21:59:02

回答

4

測試平臺對許多GAE服務使用單獨的存根,包括數據存儲和用戶服務。

我對燒瓶並不熟悉,但是如果登錄要求用戶存在於數據庫中,它會失敗,因爲測試臺使用單獨的數據庫。您必須首先將用戶數據加載到測試平臺數據庫中。

另外,如果您包含測試牀,那麼在使用它之前,您必須進行一些初始化調用以設置存根。 https://developers.google.com/appengine/docs/python/tools/localunittesting

+0

謝謝。我不確定你爲什麼提到測試存根 - 這可能有什麼影響?登錄不需要數據庫訪問;它在上面的簡化示例中定義爲'class User'。如前所述,問題不在於使用'testbed',而僅僅是導入它打破了'Flask-Login'。 – 2012-04-03 20:32:18

+1

測試牀存根替換默認的API行爲。如果你確定燒瓶沒有使用數據存儲來存儲任何東西(比如會話ID),你會想要檢查哪些其他API存根可能會影響某些東西。可能是memcache(我不知道燒瓶是否使用memcache來存儲會話),或者很可能是urlfetch。你真的需要調試一下,看看哪一個是負責任的。 – dragonx 2012-04-03 22:14:34

+0

同意,在'testbed'中必須有一些被調用的東西。問題是什麼。我已經從pdb的頂部到底部調試了幾次,但沒有發現它 - 這個問題似乎被埋在了Werkzeug的某個地方。在此期間我曾使用邪惡的猴子補丁。 :) – 2012-04-04 00:26:15

相關問題