Проверка Python на разные даты [дубликат]

import org.apache.spark.sql.functions._  

Используйте функцию substring(column, 0, 1) вместо функции LEFT.

где

  • 0: начальная позиция в строке
  • 1: количество символов, которые нужно выбрать

Пример: Рассмотрим функцию LEFT:

LEFT(upper(SKU),2)

Соответствующий оператор SparkSQL будет выглядеть следующим образом:

substring(upper(SKU),1,2) 
2
задан jonrsharpe 31 August 2016 в 14:28
поделиться

1 ответ

Используйте библиотеку unittest.mock (Python 3.3 и новее, обратные как mock ), чтобы заменить вызовы на любой код, внешний для вашего кода .

Здесь я бы высмеял не только utcnow(), но и strftime(), чтобы просто вернуть строковый объект:

with mock.patch('datetime.datetime') as dt_mock:
    dt_mock.utcnow.return_value.strftime.return_value = '2016-08-04 12:22:44.123456'
    result = DateTimeHelper.get_utc_millisecond_timestamp()

Если вы чувствуете, что тестирование strftime(), дайте dt_mock.utcnow.return_value явный объект datetime для возврата; вам нужно будет создать этот тестовый объект до , который вы издеваетесь, поскольку вы не можете издеваться над методом класса datetime.datetime.utcnow:

testdt = datetime.datetime(2016, 8, 4, 12, 22, 44, 123456)
with mock.patch('datetime.datetime') as dt_mock:
    dt_mock.utcnow.return_value = testdt
    result = DateTimeHelper.get_utc_millisecond_timestamp()

или, в своем unittests, используйте from datetime import datetime, чтобы сохранить ссылку на класс, который не высмеивается.

Демо:

>>> from unittest import mock
>>> import datetime
>>> class DateTimeHelper(object):
...     @staticmethod
...     def get_utc_millisecond_timestamp():
...         (dt, micro) = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f').split('.')
...         return "%s.%03d" % (dt, int(micro) / 1000)  # UTC time with millisecond
...
>>> with mock.patch('datetime.datetime') as dt_mock:
...     dt_mock.utcnow.return_value.strftime.return_value = '2016-08-04 12:22:44.123456'
...     result = DateTimeHelper.get_utc_millisecond_timestamp()
...
>>> result
'2016-08-04 12:22:44.123'
>>> testdt = datetime.datetime(2016, 8, 4, 12, 22, 44, 123456)
>>> with mock.patch('datetime.datetime') as dt_mock:
...     dt_mock.utcnow.return_value = testdt
...     result = DateTimeHelper.get_utc_millisecond_timestamp()
...
>>> result
'2016-08-04 12:22:44.123'
5
ответ дан Martijn Pieters 20 August 2018 в 08:14
поделиться
  • 1
    Модуль freezegun сторонних разработчиков также может быть весьма полезен и экономит время в некоторых случаях ... (имеет удобные декораторы и контекстные менеджеры) – Jon Clements♦ 31 August 2016 в 14:47
  • 2
    freezegun производит сложные издевки; Я до сих пор не видел какого-либо прецедента, когда вы не могли достичь того же с mock. Если mock является стандартом defacto, я не уверен, что когда-нибудь выберет freezegun. – Martijn Pieters♦ 31 August 2016 в 14:51
  • 3
    Я не видел, где я не мог воспроизвести что-либо, используя urllib, что я не мог с requests ... это в основном удобство - вот и все. – Jon Clements♦ 31 August 2016 в 14:55
  • 4
    @NinjaPuppy: разница между ними намного больше, намного больше urllib и requests. И mock позволяет мне подробно проверить, как меня называли мои издевательства, что-то freezegun не позволяет мне это делать. – Martijn Pieters♦ 31 August 2016 в 14:56
  • 5
    Я не говорю, что лучше или лучше. Ибо, когда я использовал его для издевательств, проще классифицировать весь набор с использованием известных параметров, чем с помощью менеджеров контекста и т. Д. ... как я уже сказал - это просто удобство ... – Jon Clements♦ 31 August 2016 в 15:08
Другие вопросы по тегам:

Похожие вопросы: