Python3, как вызвать ValueError для объекта даты и времени, если он не в правильном формате? - PullRequest
0 голосов
/ 29 марта 2019

Для универсального проекта мы должны создать программу, соответствующую некоторым тестам, которые нам дали.Тесты используют магические числа в качестве входных данных для функций.Я знаю, как заставить его вернуть объект datetime.Просто не знаю, как вызвать ошибку!

мой код:


    import datetime
    def time_to_datetime(datetimeSTR):
        datetime_obj = datetime.datetime.strptime(datetimeSTR, '%Y/%m/%d %H:%M')
        if datetimeSTR != datetime.datetime.strptime(datetimeSTR, '%Y/%m/%d %H:%M'):
            raise ValueError('The time must have the format YYYY/MM/DD HH:MM')
        else:
            return datetime_obj

Тестовый код:


    import datetime
    import os
    import unittest   # Standard unittest framework.

    import utils   # The module implementing JourneyOptions class.


    class TestTimeToDatetime(unittest.TestCase):
        """Tests for the time_to_datetime function."""

        def test_invalid_time_is_rejected(self):
            with self.assertRaises(ValueError) as cm:
                utils.time_to_datetime('2019/06/09 12:60')
            self.assertEqual(
                'The time must have the format YYYY/MM/DD HH:MM',
                str(cm.exception))

        def test_valid_time_yields_a_dattime_object(self):
            d = utils.time_to_datetime('2019/06/09 12:59')
            self.assertTrue(isinstance(d, datetime.datetime))

вот результаты, которые я получаю:

======================================================================

ERROR: test_valid_time_yields_a_dattime_object (__main__.TestTimeToDatetime)

Traceback (most recent call last):
  File "C:/Users/s5115426/Desktop/tests/test_utils.py", line 21, in test_valid_time_yields_a_dattime_object
    d = utils.time_to_datetime('2019/06/09 12:59')
  File "C:\Users\s5115426\Desktop\tests\utils.py", line 25, in time_to_datetime
    raise ValueError('The time must have the format YYYY/MM/DD HH:MM')
ValueError: The time must have the format YYYY/MM/DD HH:MM

======================================================================
FAIL: test_invalid_time_is_rejected (__main__.TestTimeToDatetime)

Traceback (most recent call last):
  File "C:/Users/s5115426/Desktop/tests/test_utils.py", line 18, in test_invalid_time_is_rejected
    str(cm.exception))
AssertionError: 'The time must have the format YYYY/MM/DD HH:MM' != 'unconverted data remains: 0'
- The time must have the format YYYY/MM/DD HH:MM
+ unconverted data remains: 0

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 29 марта 2019

Ошибка, которую вы делаете, состоит в том, что strptime вызывает ошибку значения, если строка даты не соответствует заданному формату. например:

date_str = '2019/06/09 12:60'
datetime_obj = datetime.datetime.strptime(date_str, '%Y/%m/%d %H:%M')
.
.
ValueError: unconverted data remains: 0

datetime_obj никогда не устанавливается, потому что strptime никогда не возвращает значение.

Также, как отмечалось, вы сравниваете ответ от strptime со строкой inout - это никогда не сработает.

Попробуйте более простой подход:

import datetime
def time_to_datetime(datetimeSTR):
    datetime_obj = datetime.datetime.strptime(datetimeSTR, '%Y/%m/%d %H:%M')
    return datetime_obj

Или вы можете поймать любое исключение и ререйз (например, плохая практика, но, возможно, стоит сделать это для иллюстрации.

import datetime
def time_to_datetime(datetimeSTR):
    try:
        datetime_obj = datetime.datetime.strptime(datetimeSTR, '%Y/%m/%d %H:%M')
    except ValueErr as err:
        print(err)
        raise ValueError('The time must have the format YYYY/MM/DD HH:MM')
    else:
        return datetime_obj

Таким образом, вы видите, как strptime ведет себя для различных входных данных в вашем тесте, и у вас есть обработка ошибок в вашей функции ... хотя, как я уже говорил, пересмотр ошибки является (имо) плохой практикой.

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