2016-04-01 4 views
3

У меня есть приложение с 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() в моих тестах

+0

Вы можете вызвать 'db.session.delete (object)' как часть очистки тестового примера. Или вызов 'session.rollback()' должен возвращать любые транзакционные изменения, которые не были зафиксированы. –

+0

На самом деле я делаю откат() как на моем setUp(), так и на tearDown(). Я мог бы сделать delete(), но я бы предпочел не следить за каждым созданным объектом, а затем удалять его. – limasxgoesto0

+0

Альтернативой является переопределение конфигурации SQLAlchemy для использования отдельной базы данных для тестирования. Посмотрите на [Miguel Grinberg's Flask Megatutorial] (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing) на модульное тестирование. В своей тестовой версии он меняет SQLAlchemy URI для использования тестовой базы данных SQLite. Конечно, если вы пытаетесь протестировать psql, это побеждает цель, но вам не нужно беспокоиться о том, что тесты остаются в вашей производственной базе данных. –

ответ

0

Использование test_client рядом flush и rollback является правильным подход. Каковы ваши опасения по поводу jsonify? Я не вижу связи с вашим основным вопросом.

Возможно, ваш откат отката не называется так, как вам хотелось бы. Включение отката в линию позволяет проверить состояние, как часть теста.

Вот сущность, показывающая, что этот подход работает. https://gist.github.com/bhtucker/58a90e59265a0994bf42a23921d69718

Вы должны быть в состоянии просто запустить bash setup_and_test.sh в среде с инструментами psql и соответствующими зависимостями python.

+0

Выполняется откат (я дважды проверяю, помещая его в строку - данные все еще сохраняются), и я только когда-либо явно вызываю flush, никогда не совершаю. Commit вызывается за кулисами, когда я делаю запрос через '' 'test_client''', который я проверил, перезаписывая фиксацию и запрашивая базу данных, пройдя тест через ipdb. После того, как база данных сможет запросить его, rollback() ничего не будет стирать. Мои проблемы с jsonify связаны с тем, что я бы просто попробовал сам метод просмотра, что бы легко решить мою проблему. – limasxgoesto0

+0

Я могу выполнить двойную проверку позже, но пока откатывание не решило мои проблемы – limasxgoesto0

+0

Перед тем, как совершить сделку, информация видна только в той же транзакции. 'db.session.add' запускает транзакцию, и запрос представления также запускается внутри этой транзакции (см. раздел). Для меня более тревожным является то, что вы видите фиксацию во время запроса через 'test_client'! Это не нормально – bhtucker

 Смежные вопросы

  • Нет связанных вопросов^_^