簡體   English   中英

使用login_required對flask瓶測試進行單元測試

[英]unit testing flask app with login_required

我的燒瓶應用程序設置有以下測試用例

class AboutViewTest(BaseTestCase):
    def setUp(self):
        self.url = url_for('pages_app.about',_external=True)
        self.url_login_redirect = url_for('accounts_app.login')

    def test_render(self):
        # without login
        resp = self.client.get(self.url)
        self.assertRedirects(resp, self.url_login_redirect)

        # after login
        with self.app.test_client() as c:
            login_successful = self.login(username='user1', password="123456", client=c)
            self.assertTrue(login_successful)
            resp = c.get(self.url)
            self.assertStatus(resp, 200) # this fails

使用@login_required測試視圖

@pages_app.route('/about/')
@login_required
def about():
    return render_template('pages/about.html')


def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if g.user is None:
            return redirect(url_for('accounts_app.login', next=request.url))
        return f(*args, **kwargs)
    return decorated_function

第二個測試用例失敗(需要登錄),因為它被重定向到登錄302 != 200

如何測試此視圖以傳遞兩種情況(使用和不使用登錄)? 這是最好的做法嗎?

最好的方法可能是按照Flask文檔中的建議填充g.user變量:

def get_user():
    user = getattr(g, 'user', None)
    if user is None:
        user = fetch_current_user_from_database()
        g.user = user
    return user

顯然,你必須定義fetch_current_user_from_database() ,你將實例化一個用戶(我假設你有一個User類)並返回它。 然后只需調用get_user()即可讓用戶在需要時立即登錄。

作為替代方案,您可以在設置中添加標志以禁用登錄,並在測試時在login_required方法中使用它。

例如:

from flask import current_app

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_app.config.get('LOGIN_DISABLED', False) and g.user is None:
            return redirect(url_for('accounts_app.login', next=request.url))
        return f(*args, **kwargs)
    return decorated_function

然后在你的測試中:

def test_render(self):
    # without login
    resp = self.client.get(self.url)
    self.assertRedirects(resp, self.url_login_redirect)

    self.app.config['LOGIN_DISABLED'] = True

    resp = c.get(self.url)
    self.assertStatus(resp, 200)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM