Тестовый набор Django created_at поле

#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,..)
  

Другие идеи являются приспособлениями или издевательствами