2016-01-21 87 views
0

我想測試我的Python Flask應用程序的登錄功能。登錄測試在Python中失敗Flask單元測試

我創建一個用戶並將它們添加到test_adduser()測試中的數據庫中,並且傳遞正常。但是,test_login()測試失敗並出現斷言錯誤。我已經調試了代碼,並且測試加載了登錄頁面,因此我知道問題不在應用程序或路由等方面),但它不會登錄並重定向用戶。

我意識到這個帖子在描述上有點短,即錯誤跟蹤,但是錯誤實際上是「AssertionError」。
也許我正在做一些明顯錯誤的事情,比如我將用戶憑據傳遞給測試的方式,並且有人可以向我指出這一點?

謝謝!

from flask.ext.testing import TestCase 
from flask import Flask 
from Shares import db, app as appy 
from Shares.models import User 
import manage 


class test(TestCase): 

def create_app(self): 
    app = Flask(__name__) 
    app.config['TESTING'] = True 
    return appy 

SQLALCHEMY_DATABASE_URI = "sqlite://" 
TESTING = True 

def setUp(self): 

    manage.initdb() 
    #print self.login('lucas', 'test').data 

def tearDown(self): 

    db.session.remove() 
    db.drop_all() 

def login(self, username, password): 
    return self.client.post('/login', data=dict(
     username=username, 
     password=password 
    ), follow_redirects=True) 

def logout(self): 
    return self.client.get('/logout', follow_redirects=True) 

def test_adduser(self): 

    lucas=User(username="lucas", email="[email protected]", password="test") 
    user2 = User(username="lucas", email="[email protected]") 

    db.session.add(lucas) 
    db.session.commit() 

    assert lucas in db.session 
    assert user2 not in db.session 

def test_login(self): 
    lucas=User(username="lucas", email="[email protected]", password="test") 
    db.session.add(lucas) 

    rv = self.login('lucas', 'test') 
    assert 'Welcome' in rv.data 
+0

您在測試之間重置您的數據庫。除非'manage.initdb'插入一個用戶,否則你沒有用戶登錄'test_login'。 – dirn

+0

謝謝,manage.initdb確實添加了一個用戶,但我已經在這裏編輯了代碼來澄清這一點。 –

+0

如果'manage.initdb'在'test_login'中添加了一個與用戶匹配的用戶,'test_adduser'應該違反用戶名限制。另外,'test_adduser'實際上不會測試你的應用程序;它測試SQLAlchemy。 SQLAlchemy有它自己的測試。您不需要將其作爲測試套件的一部分進行測試。 – dirn

回答

0

好的,所以我最終完成了。我需要停用CSRF保護。這樣做的技巧:

def create_app(self): 
    app = Flask(__name__) 
    appy.config['TESTING'] = True 
    appy.config['WTF_CSRF_ENABLED'] = False 
    return appy