Flask-testing : self.client.delete() return 200 但失败了,因为他没有删除任何东西
Flask-testing : self.client.delete() return 200 but fail as he doesnt delete anything
我有一个使用 SQL Alchemy 和 postgresql 的 CRUD 足球运动员烧瓶应用程序。
我正在尝试使用 unittest 和 flask-testing 对其进行测试,但是当我在播放器上测试删除和修补请求时(根据他的号码),statut returned 是 200 但播放器没有从数据库所以测试失败。
我的 app.py :
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='postgresql://postgres:password@localhost:5432/flask-sql-alchemy'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
modus = Modus(app)
class om_player(db.Model):
__tablename__ = "players"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
number = db.Column(db.Integer)
age = db.Column(db.Integer)
def __init__(self, name, number, age):
self.name = name
self.number = number
self.age = age
@app.route('/joueurs/<int:number>', methods=["GET", "PATCH", "DELETE"])
def show(number):
found_player = om_player.query.filter_by(number=number).first()
if request.method == b"PATCH":
found_player.name = request.form['name']
found_player.number = request.form['number']
found_player.age = request.form['age']
db.session.add(found_player)
db.session.commit()
return redirect(url_for('show', number=request.form['number']))
if request.method == b"DELETE":
db.session.delete(found_player)
db.session.commit()
return redirect(url_for('joueurs'))
return render_template('show.html', player=found_player)
我的test.py:
from app import app,db, om_player
from flask_testing import TestCase
import unittest
class BaseTestCase(TestCase):
def create_app(self):
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:password@localhost:5432/flask-sql-alchemy'
app.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = False
return app
def test_delete(self):
response = self.client.delete('/joueurs/18', follow_redirects=True)
self.assertEqual(response.status_code, 200)
self.assertNotIn(b"AMAVI", response.data)
if __name__ == '__main__':
unittest.main()
(joueurs 在法语中是玩家的意思)
当我运行pythontest.py:
AssertionError: 在 b'my edit.html 文件'
中意外发现 b'AMAVI'
因此编号为 18 且名为 "AMAVI" 的播放器没有被删除,我不明白为什么因为删除请求 return 200 而我的应用程序在本地服务器上运行良好。
如果您使用的是 Python3,b"PATCH"
和 b"DELETE"
将不再按照您的预期运行。这些测试因 "POST" 而失败,并落入默认的 "GET" 案例。
评估
"POST" == b"POST"
在 Python3 REPL 中进行确认。
我有一个使用 SQL Alchemy 和 postgresql 的 CRUD 足球运动员烧瓶应用程序。 我正在尝试使用 unittest 和 flask-testing 对其进行测试,但是当我在播放器上测试删除和修补请求时(根据他的号码),statut returned 是 200 但播放器没有从数据库所以测试失败。
我的 app.py :
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='postgresql://postgres:password@localhost:5432/flask-sql-alchemy'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
modus = Modus(app)
class om_player(db.Model):
__tablename__ = "players"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
number = db.Column(db.Integer)
age = db.Column(db.Integer)
def __init__(self, name, number, age):
self.name = name
self.number = number
self.age = age
@app.route('/joueurs/<int:number>', methods=["GET", "PATCH", "DELETE"])
def show(number):
found_player = om_player.query.filter_by(number=number).first()
if request.method == b"PATCH":
found_player.name = request.form['name']
found_player.number = request.form['number']
found_player.age = request.form['age']
db.session.add(found_player)
db.session.commit()
return redirect(url_for('show', number=request.form['number']))
if request.method == b"DELETE":
db.session.delete(found_player)
db.session.commit()
return redirect(url_for('joueurs'))
return render_template('show.html', player=found_player)
我的test.py:
from app import app,db, om_player
from flask_testing import TestCase
import unittest
class BaseTestCase(TestCase):
def create_app(self):
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:password@localhost:5432/flask-sql-alchemy'
app.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = False
return app
def test_delete(self):
response = self.client.delete('/joueurs/18', follow_redirects=True)
self.assertEqual(response.status_code, 200)
self.assertNotIn(b"AMAVI", response.data)
if __name__ == '__main__':
unittest.main()
(joueurs 在法语中是玩家的意思)
当我运行pythontest.py:
AssertionError: 在 b'my edit.html 文件'
中意外发现 b'AMAVI'因此编号为 18 且名为 "AMAVI" 的播放器没有被删除,我不明白为什么因为删除请求 return 200 而我的应用程序在本地服务器上运行良好。
如果您使用的是 Python3,b"PATCH"
和 b"DELETE"
将不再按照您的预期运行。这些测试因 "POST" 而失败,并落入默认的 "GET" 案例。
评估
"POST" == b"POST"
在 Python3 REPL 中进行确认。