Как смоделировать дату и время в одном файле? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть два файла, в которых я использую datetime.Есть ли способ издеваться над ним только в одном файле, а не в другом?Ниже приведен пример, где я наблюдаю странное поведение.

Файл: test_file_one.py

import datetime as dt
def print_datetime():
    print 'First: {}'.format(dt.datetime.utcnow())

Файл: test_file_two.py

import datetime as dt
def print_datetime():
    print 'Second: {}'.format(dt.datetime.utcnow())

Файл: main.py

import test_file_one as first
import test_file_two as second
import mock
from datetime import datetime, timedelta

@mock.patch('test_file_one.dt.datetime')
def main(mock_datetime):
    mock_datetime.utcnow.return_value = datetime.utcnow() + timedelta(days=1)
    first.print_datetime()
    second.print_datetime()

if __name__ == '__main__':
    main()

Вывод

First: 2018-06-12 08:12:43.838243
Second: 2018-06-12 08:12:43.838243

Как видите,оба возвращают одно и то же время, которое было высмеяно.

  1. Почему оба издеваются?
  2. Как ограничить макет одним файлом?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете просто добавить столько результатов, сколько хотите сделать, к side_effect

mock_datetime.utcnow.side_effect = [datetime.utcnow() + timedelta(days=1), datetime.utcnow() + timedelta(days=2)] 
0 голосов
/ 11 июня 2018

Я бы посоветовал вам уменьшить область вашего насмешки.

Теперь вы применяете свой макет ко всему методу, используя декоратор @mock.patch('test_file_one.dt.datetime')

Вместо этого вы можете попробовать что-нибудьнапример:

def main(mock_datetime):
    with mock.patch('test_file_one.dt.datetime') as mock_datetime:
        mock_datetime.utcnow.return_value = datetime.utcnow() + timedelta(days=1)
        first.print_datetime()

    second.print_datetime()

В качестве альтернативы вы можете использовать метод fake_time из библиотеки libfaketime-tz-wrapper.

Тогда ваш подход будет выглядеть примерно так:

from libfaketime_tz_wrapper import fake_time

def main(mock_datetime):
    with fake_time(datetime.utcnow() + timedelta(days=1)):
        first.print_datetime()

    second.print_datetime()

Я не проверял, работают ли мои предложения, но я много использовал fake_time за последние 1,5 года и, кажется, очень полезен для подобных вопросов.

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