unittest.mock
library(Python 3.3以降、バックポートはmock
)を使用して、コードの対象外のコードへの呼び出しを置き換えます。
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
オブジェクトにを与える:ここで
、私は文字列オブジェクトを返すために、あまりないだけutcnow()
なく、strftime()
をモックと思います代わりに戻る。 、あなたのユニットテストでは、
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()
かへの参照を保持するためにfrom datetime import datetime
を使用する:あなたはちょうどdatetime.datetime.utcnow
クラスメソッドをモックすることができないとして、あなたが、しかしモック前に、そのテスト・オブジェクトを作成する必要があると思います嘲笑されないクラス。
デモ:
>>> 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'
モックアウト 'utcnow'が知られている日時を返すように? – jonrsharpe
datetimeを「模擬」することができます:http://stackoverflow.com/questions/4481954/python-trying-to-mock-datetime-date-today-bod-not-working。 – alecxe