2016-03-20 124 views
2

處理單元測試的最佳方法是依靠調用代碼,而代碼又依賴於當前應用程序的配置?在單元測試期間燒瓶app.config

例如

code.py

from flask import current_app 

def some_method(): 
    app = current_app._get_current_object() 
    value = (app.config['APP_STATIC_VAR'])*10 
    return value 

test_code.py

class TestCode(unittest.TestCase): 
    def test_some_method(self): 
     app = create_app('app.settings.TestConfig') 
     value = some_method() 
     self.assertEqual(10, value) 

運行測試上述我得到一個 'RuntimeError:工作應用程序上下文的外部' 錯誤時,應用程序= create_app('app.settings.TestConfig')行被執行。

在測試過程中調用app = create_app並不能解決問題。在這種情況下,我需要在應用程序中讀取配置的單元測試的最佳方式是什麼?

+1

其實你沒有做單元測試在這裏,但集成測試。因此,無論您需要重構代碼(例如傳遞配置)以允許單元測試或應用方法進行集成測試。這是標準答案。 [但我傾向於拉伸'unitest'也](http://stackoverflow.com/questions/36068957/mocking-where-its-defined-in-python-mock),我渴望知道是否有人下降與很酷的想法。也許'mock.patch'ing'flask.current_app'左右... – flaschbier

+0

我會問的問題是你到底想用不同的配置值測試什麼?你的應用應該如何運作?另外,使用不同的應用程序配置,您是否可以使用Flask的[測試客戶端](http://flask.pocoo.org/docs/0.10/testing/#the-testing-skeleton)? – idjaw

回答

2

您正在使用訪問應用程序環境中的應用程序,當你調用some_method()來修復它替換爲您的來電:

with app.app_context(): 
    value = some_method()