У меня есть приложение с SQLAlchemy, инициализирован:Проверка проверки флагов: как предотвратить сохранение данных в базе данных?
config_name = os.getenv('FLASK_CONFIG') or 'default'
app = Flask(__name__)
db = SQLAlchemy(app)
db.init_app(app)
и вид я работаю на том, что просто возвращает всех пользователей в формате JSON:
@app.route('/users', methods=['GET'])
def users():
users = db.session.query(User)
output = {'users': [user.to_json() for user in users]}
return jsonify(**output)
И мой тест:
class UserViewTest(BaseTestCase, CreateUserMixin):
def test_users(self):
user1 = self._make_user() # defined in the above mixin
user2 = self._make_user()
user2.email = '[email protected]'
user2.username = '[email protected]'
db.session.add_all([user1, user2])
db.session.flush()
response = app.test_client().get('/users')
Выполняю мои тесты с помощью FLASK_CONFIG=testing nosetests
(и я проверил, для параметра app.testing установлено значение true).
Запуск этого в отношении моей базы данных psql, я нахожу, что эти пользователи, которых я добавил в базу данных, сохраняются!
triller_social_test=# SELECT username FROM users;
username
---------------
foobar
[email protected]
(2 rows)
Как остановить это? Я попробовал перезаписать db.session.commit(), чтобы ничего не делать, но откатывание базы данных при вызове вида. Есть ли альтернатива использованию test_client()
? Я не могу вызвать метод напрямую, так как jsonify
не позволяет мне возвращать данные куда угодно, кроме ответа.
Update: Вот мое временное решение (?):
def json_response_converter(dict_):
if config_name == 'testing':
return dict_
else:
return jsonify(**dict_)
Теперь мне не нужно использовать jsonify() в моих тестах
Вы можете вызвать 'db.session.delete (object)' как часть очистки тестового примера. Или вызов 'session.rollback()' должен возвращать любые транзакционные изменения, которые не были зафиксированы. –
На самом деле я делаю откат() как на моем setUp(), так и на tearDown(). Я мог бы сделать delete(), но я бы предпочел не следить за каждым созданным объектом, а затем удалять его. – limasxgoesto0
Альтернативой является переопределение конфигурации SQLAlchemy для использования отдельной базы данных для тестирования. Посмотрите на [Miguel Grinberg's Flask Megatutorial] (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing) на модульное тестирование. В своей тестовой версии он меняет SQLAlchemy URI для использования тестовой базы данных SQLite. Конечно, если вы пытаетесь протестировать psql, это побеждает цель, но вам не нужно беспокоиться о том, что тесты остаются в вашей производственной базе данных. –