Форум сайта python.su
Добрый день. Использую Flask + SQLAlchemy.
Имеется модель такого типа:
class Entry(db.Model): __tablename__ = 'entries' name = db.Column(db.String(100)) created = db.Column(db.DateTime(), default=datetime.now) updated = db.Column(db.DateTime(), default=datetime.now, onupdate=datetime.now)
class ViewTestCase(AppliactionTestCase): def test(self): with freeze_time("2014-06-01 16:00:00"): db.session.add(Entry(name="title")) db.session.commit() entry = db.session.query(Entry).first() self.assertEqual(entry.created, datetime(2014, 6, 1, 16, 0, 0)) self.assertEqual(entry.updated, datetime(2014, 6, 1, 16, 0, 0)) with freeze_time("2014-07-01 17:00:00"): entry.name = 'edited title' db.session.add(entry) db.session.commit() entry = db.session.query(Entry).first() self.assertEqual(entry.created, datetime(2014, 6, 1, 16, 0, 0)) self.assertEqual(entry.updated, datetime(2014, 7, 1, 17, 0, 0))
created = db.Column(db.DateTime(), default=lambda: datetime.now())
Отредактировано qnica (Март 18, 2015 16:28:11)
Офлайн
Что Вы тестируете? Я, если честно, понять не могу
Офлайн
У меня была опечатка в последнем ассерте.
Вообще это выдернута часть теста. В тесте между сохранениями дергается рест апи.
Суть этого фрагмента: сохранять в заданное время сущность и проверить что ее время обновления, то, в которое мы его сахранили.
Офлайн
Сложновато Вы придумали. Я бы в тесте сохранил время создания и после обновления проверил бы, что времена не совпадают. Или нужна повышенная точность? Просто подмена для такого теста уж как-то слишком витиевато
Офлайн
Это приемочный тест. Хотелось бы в нем все механизмы отфиксировать.
Мне просто не понятно где именно нужен патч для datetime. Ведь если я подсовываю в самой модели лямюду в default то все работает нормально:
created = db.Column(db.DateTime(), default=lambda: datetime.now())
Отредактировано qnica (Март 18, 2015 17:18:32)
Офлайн
пропробуй явно время задать зачем freezegun
и зачем обновлять запись если поля не изменились?
Офлайн
По условию у каждой записи должн быть свой период актуализации. Когда запись “протухает” об этом оповещается клиент, который сверяет данные и если все нормально, то сохраняет запись, тем самым актуализируя ее.
В приемочном тесте я действую от роли пользователся, дергая рест апи. По этому я использую freezegun и стараюсь не вмешиваться в процессы создания записей руками.
Офлайн
qnica
Мало того, что он неверный, он еще губителен.
По второму вопросу. Попробуйте метод .update(). Но Вы опять колдуете Неужели в объекте нет ни одного поля, которое можно было бы обновить и проверить. Запись хранит только время? Тогда спроектированная БД, как бы не было печально, неверна в принципе…
Офлайн
qnica
не совсем понимаю что вы делаете
как происходит актуализация? изменение поля update?
что имеется в виду под оповещением клиента?
Офлайн
4kpt_III
Но Вы опять колдуете Неужели в объекте нет ни одного поля, которое можно было бы обновить и проверить. Запись хранит только время?
sander
как происходит актуализация? изменение поля update?
Офлайн