Python Flask单元测试中登录测试失败
我正在尝试测试Python Flask应用程序的登录功能 我创建了一个用户,并将其添加到Python Flask单元测试中登录测试失败,python,python-2.7,unit-testing,flask,Python,Python 2.7,Unit Testing,Flask,我正在尝试测试Python Flask应用程序的登录功能 我创建了一个用户,并将其添加到test\u adduser()test中的数据库中,结果很好。但是,test\u login()测试失败,并出现断言错误。我已经调试了代码,测试加载了登录页面ok(因此我知道问题不在于应用程序或路由等),但它不会登录并重定向用户 我意识到这篇文章的描述有点短,即错误跟踪,但是错误的字面意思是“断言错误” 也许我做了一些明显错误的事情,比如我将用户凭证传递给测试的方式,有人会向我指出这一点 谢谢 from f
test\u adduser()
test中的数据库中,结果很好。但是,test\u login()
测试失败,并出现断言错误。我已经调试了代码,测试加载了登录页面ok(因此我知道问题不在于应用程序或路由等),但它不会登录并重定向用户
我意识到这篇文章的描述有点短,即错误跟踪,但是错误的字面意思是“断言错误”也许我做了一些明显错误的事情,比如我将用户凭证传递给测试的方式,有人会向我指出这一点 谢谢
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="lucas@example.com", password="test")
user2 = User(username="lucas", email="lucas@test.com")
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="lucas@example.com", password="test")
db.session.add(lucas)
rv = self.login('lucas', 'test')
assert 'Welcome' in rv.data
好的,所以我最终解决了这个问题。我需要停用CSRF保护。这就成功了:
def create_app(self):
app = Flask(__name__)
appy.config['TESTING'] = True
appy.config['WTF_CSRF_ENABLED'] = False
return appy
在测试之间重置数据库。除非
manage.initdb
插入用户,否则您没有用户可登录test\u login
。谢谢,manage.initdb确实添加了一个用户,但我在这里编辑了代码以澄清这一点。如果manage.initdb
添加了一个与test\u login
中的用户匹配的用户,test\u adduser
应违反用户名约束。而且,test\u adduser
实际上并不测试您的应用程序;它测试炼金术。SQLAlchemy有自己的测试。您不需要将其作为测试套件的一部分进行测试。谢谢,很抱歉我不清楚,最初用户是在manage.initdb()中添加的,但为了更清楚,我将其移动到了测试文件中。我不小心把它从代码中漏掉了,所以不清楚。上面编辑的代码是我现在拥有的,但仍然不起作用。感谢SQLAlchemy测试的帮助,我相信你可以看到我在这里有点像n00b,所以这是我一定要研究的:)rv.data的价值是什么?不知道你是如何计算出来的,但它对我帮助很大。禁用WTF CSRF检查也帮了我。谢谢