2015-02-10 96 views
1

我正在使用Pytest夾具與燒瓶。我的應用程序使用應用程序工廠實例化。如何測試Flask是否使用test_client而不是客戶端?

#conftest.py 

@pytest.fixture(scope='session') 
def app(request): 
    '''Session-wide test application''' 
    app = create_app('testing') 
    app.client = app.test_client() 
    app_context = app.app_context() 
    app_context.push() 


    def teardown(): 
     app_context.pop() 

    request.addfinalizer(teardown) 
    return app 

我想驗證我的燈具創建的應用程序使用Flask's built-in test_client,所以我寫了一個測試:

#test_basics.py 

def test_app_client_is_testing(app): 
    assert app.client() == app.test_client() 

當我運行這個測試,我得到:TypeError: 'FlaskClient' object is not callable

我是什麼我做錯了?

測試不正確,或者夾具不正確?

回答

4

app.client已經是一個實例,你不應該再次調用它。最終,這個測試沒有意義。當然,客戶端是一個測試客戶端,這就是你在夾具中創建它的方式。而且,客戶永遠不會平等,他們是不同的實例。

from flask.testing import FlaskClient 

assert app.client == app.test_client() # different instances, never true 
assert isinstance(app.client, app.test_client_class or FlaskClient) # still pointless, but correct 

你可能想要的是兩場比賽:appclient,而不是在應用程序創建客戶端。

@pytest.yield_fixture 
def app(): 
    a = create_app('testing') 
    a.testing = True 

    with a.app_context(): 
     yield a 

@pytest.yield_fixture 
def client(app): 
    with app.test_client() as c: 
     yield c 

from flask.testing import FlaskClient 

def test_app_client_is_client(app, client): 
    # why? 
    assert isinstance(client, app.test_client_class or FlaskClient) 
+0

啊,這使得分割它們更有意義。雖然你爲什麼不把「請求」傳遞給'app()'?我實際上不明白爲什麼請求需要通過,但我正在努力[這個例子](http://alexmic.net/flask-sqlalchemy-pytest/),它包括在內。 – 2015-02-10 23:14:14

+0

@JeffWidman我使用了新的'yield_fixture'而不是'fixture',所以我不需要在'request'上單獨註冊清理。對不起,如果這是令人困惑。 – davidism 2015-02-10 23:15:25

+0

哦,是的,我忘記了回調。謝謝! – 2015-02-10 23:18:43

相關問題