Как я могу проверить даты и время в разных форматах? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть веб-приложение, которое я тестирую. Я пытаюсь протестировать сериализаторы drf, но сериализаторы меняют формат datetime, поэтому идентичные даты, отформатированные по-разному, не проходят тест, потому что они не идентичны.

Я пытался отформатировать сериализатор timeDateField, но все используемые им форматы strftime заполнены нулями, а мой тестовый атрибут Users-last-login дает дату без заполнения нулями. Я думаю, что решение может быть решено так, как выбранный ответ описывает здесь , но это кажется немного отрывочным, и в идеале я, как человек, которому придется поддерживать этот код, хочу более чистый или более питонический раствор.

Вот тест:

class UserTest(TestCase):

    def setup(self):

        last_login = datetime.datetime(2000, 1, 1, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
        date_joined = datetime.datetime(2019, 2, 2, hour=2, minute=2, second=2, microsecond=2, tzinfo=None)
        birthdate = timezone.now().date()
        renewal = timezone.now().date()

        return User.objects.create(username='test_user', first_name='test_first', last_name='test_last',
                                   email='test_mail', last_login=last_login, date_joined=date_joined,
                                   birthdate=birthdate, gender='U', renewal=renewal)

    def test_user_serializer(self):
        self.u = self.setup()
        serializer = UserSerializer(self.u, many=False)
        data = serializer.data
              .....
    # tests for serialized attributes
        self.assertEquals((data['last_login']), self.u.last_login)  # FAILING THE TEST

Вот UserSerializer:

class UserSerializer(serializers.ModelSerializer):

    last_login = serializers.DateTimeField
    date_joined = serializers.DateTimeField
    birthdate = serializers.DateField
    renewal = serializers.DateField

    class Meta:
        model = User
        fields = ('__all__')

Вот ошибка, которую я получаю:

self.assertEquals(data['last_login'], self.u.last_login)
AssertionError: '2000-01-01T00:00:00Z' != datetime.datetime(2000, 1, 1, 0, 0)

В модели атрибут last_login представляет собой dateTimeField.

Стоит ли пытаться изменить форматы одного из тестируемых элементов или есть способ написать тест, который сравнивает даты независимо от формата?

Пожалуйста, сообщите. Спасибо.

1 Ответ

1 голос
/ 27 июня 2019

Причиной вашей ошибки является то, что вы пытаетесь сравнить два разных типа / объекта данных.В строке ниже: -

'2000-01-01T00:00:00Z' != datetime.datetime(2000, 1, 1, 0, 0)

На LHS у нас есть строка ( Формат отметки времени ISO 8601 ), а в RHS - объект datetime.Поэтому приведенная выше операция всегда будет приводить к ошибке, так как тип данных не совпадает.

Таким образом, у вас есть два варианта, либо вы можете преобразовать RHS (объект datetime) в строку, используя функциюкак strftime().Или вы можете создать объект datetime из LHS (строка метки времени).

Я объясню первый метод, так как он легче одного из двух.

Итак, чтобы преобразоватьобъект datetime, в строку, мы должны передать его через strftime().

strftime () принимает в качестве аргумента объект datetime ** / tuple и преобразует его в строку в соответствии с форматомСпецификация.

, поэтому, если мы передадим datetime.datetime(2000, 1, 1, 0, 0) через strftime() со спецификацией формата ISO 8601, тогда мы получим желаемый формат.

Пример: -

import datetime

datet_obj = datetime.datetime(2000, 1, 1, 0, 0)

datet_str = datet_obj.strftime("%Y-%m-%dT%H:%M:%SZ")

print(datet_str)

Вывод: -

'2000-01-01T00:00:00Z'

Таким образом, вы можете преобразовать объекты даты и времени в строки нужного формата.

Теперь, если мысоздайте один лайнер для всего этого, а затем выполните сравнение, т.е.

'2000-01-01T00:00:00Z' != datetime.datetime(2000, 1, 1, 0, 0).strftime("%Y-%m-%dT%H:%M:%SZ")

Вышеприведенный код успешно выполнен и выдает False , так как LHS и RHS равны.

** Объект типа datetime обычно является выводом strptime().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...