#python #django #unit-testing
#python #django #модульное тестирование
Вопрос:
У меня есть следующая модель в Django ( models.py
)
from django.db import models
# Create your models here.
class Session(models.Model):
session_token = models.TextField(default="")
code = models.CharField(max_length= 5, default="")
active = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Теперь у меня есть следующая функция для тестирования.
def get_active_session_older_than_hours(older_than_hours):
older_date_time = datetime.datetime.now() - datetime.timedelta(hours=older_than_hours)
data = Session.objects
.filter(active=True, updated_at__lte=older_date_time)
.values_list('code')
return data
Я хочу это протестировать.
from django.test import TestCase
#Working fine
class ActiveSessionsNotPreset(TestCase):
def test(self):
data = get_active_session_older_than_hours(3)
self.assertEqual(len(data), 0)
#This is not working.
#It is not getting the result.
class ActiveSessionPresent(TestCase):
def setUp(self):
older_date_time = datetime.datetime.now() - datetime.timedelta(hours=4)
Session.objects.create(session_token='',
code='US', active=True,
created_at=older_date_time,
updated_at=older_date_time)
def test(self):
data = get_active_session_older_than_hours(3)
print("DEVENDER data " str(data))
self.assertEqual(len(data), 1)
Во втором тестовом примере я не получаю никакого результата. Каков правильный способ принудительного created_at
и updated_at
?
Комментарии:
1. проверьте библиотеку freezegun , которая позволяет вам имитировать дату и время в тестах
Ответ №1:
Самым простым способом было бы использовать .update(), поскольку он выполнял бы инструкцию UPDATE SQL, которая не будет вызывать ни один из методов Django
session = Session.objects.create(session_token='', ...).
session.filter(pk=session.pk).update(updated_at=older_date_time,..)
Другие идеи являются приспособлениями или издевательствами