Flask-тестирование: self.client.delete () возвращает 200, но терпит неудачу, поскольку он ничего не удаляет - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть приложение для игры в футбол CRUD, использующее SQL Alchemy и postgresql.Я пытаюсь протестировать его с помощью юнит-теста и флеш-тестирования, но когда я тестирую запрос на удаление и исправление для игрока (на основе его номера), возвращается статут 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 означает игроков по-французски)

Когда язапустите python test.py:

AssertionError: b'AMAVI 'неожиданно обнаружен в файле b'my edit.html'

Таким образом, проигрыватель с номером 18 и именем «AMAVI» не удаляется иЯ не понимаю, почему, поскольку запрос на удаление возвращает 200, и мое приложение работает нормально на локальном сервере.

1 Ответ

0 голосов
/ 28 декабря 2018

Если вы используете Python3, b"PATCH" и b"DELETE" больше не будут делать то, что вы ожидаете.Эти тесты не выполняются для «POST» и переходят к стандартному регистру «GET».

Оценка

"POST" == b"POST"

в REPL Python3 для подтверждения.

...