2014-02-09 49 views
2

我試着寫我的OpenID的燒瓶應用單元測試,但在調用時瓶OpenID的單元測試

oid.try_login(<oid provider>, <params>)

我得到一個錯誤:

RuntimeError: <class 'flask.testing.FlaskClient'> does not support redirect to external targets

因此,像每一個好SO用戶,我四處尋找一些解決方案:

  1. 使用NoExtRef燒瓶擴展名僞裝oid提供程序。我不確定這是否可以在應用程序級別進行,因爲我認爲圍繞oid url(並且在我嘗試它時將它重定向到了原始頁面)。但是,由於我正在爲單元測試嚴格執行代碼,所以這看起來很難看。
  2. 創建我自己的oid服務器,但是這可能仍然是外部重定向(稍後我會盡快嘗試此操作)。

我想另一種選擇是忽略編寫登錄單元測試,並使用真棒Flask測試框架將用戶設置在Flask.g中。但我寧願保持登錄單元測試。

回答

1

有一個選擇 - 猴子補丁開放ID擴展的try_login方法:

class LoginTestMonkeyPatch(object): 
    def __init__(self, oid=None, default_response=None): 
     self.response = default_response 
     if oid is not None: 
      self.init(oid) 

    def init(self, oid): 
     oid.try_login = self.try_login 


    def try_login(self, *args, **kwargs): 
     # Do whatever you want to do here 
+0

有點晚迴應,但這種方法工作得很好。感謝您向我介紹猴子補丁! – rith87

0

如果要修補的登錄,您可能無法測試它。

我有同樣的問題。對我來說,最好的解決方案是禁用視圖的「需要登錄」部分。

我不知道,如果你使用的瓶登錄,但如果你是,你可以繞過@login_required這樣你甚至不需要擔心試圖用類似登錄用戶:

def setUp 
    env = Environments(app) 
    env.from_object('config.Testing') 
    lm = LoginManager() 
    lm.init_app(app) 
    self.app = app.test_client() 

只是一個想法,我希望這可以幫助你或其他人:)

PS這是我在Stack Overflow上的第一篇文章。感謝所有幫助過我的海報!