【发布时间】:2021-07-02 10:04:38
【问题描述】:
我在unittest docs 的以下示例中模拟模块sample.py 中的以下函数:
import datetime
from random import randint
def useless_date():
today_date = datetime.date.today()
x = randint(0,1000)
dt = datetime.timedelta(days = x)
return today_date + dt
我已经设置了一个 test_file,我注意到 python 中有一些我不理解的奇怪行为。如果使用显式 date 和 timedelta 导入,测试运行得非常好:
from unittest import mock
from sample import useless_date
from datetime import date, timedelta
@mock.patch("sample.datetime.date")
@mock.patch("sample.datetime.timedelta")
def test_useless_date(mock_timedelta, mock_date):
mock_date.today.return_value = date(1999, 1, 1)
mock_timedelta.return_value = timedelta(days=1)
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
assert useless_date() == date(1999, 1, 2)
但是,如果我只导入 datetime 模块而不显式导入 date 和 timedelta,则会出现递归错误。
代码:
from unittest import mock
from sample import useless_date
import datetime
@mock.patch("sample.datetime.date")
@mock.patch("sample.datetime.timedelta")
def test_useless_date(mock_timedelta, mock_date):
date = datetime.date
timedelta = datetime.timedelta
mock_date.today.return_value = date(1999, 1, 1)
mock_timedelta.return_value = timedelta(days=1)
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
assert useless_date() == date(1999, 1, 2)
错误:
__________________________________________________________________________________________________________ test_useless_date ___________________________________________________________________________________________________________
mock_timedelta = <MagicMock name='timedelta' id='4466974048'>, mock_date = <MagicMock name='date' id='4467058096'>
@mock.patch("sample.datetime.date")
@mock.patch("sample.datetime.timedelta")
def test_useless_date(mock_timedelta, mock_date):
date = datetime.date
timedelta = datetime.timedelta
mock_date.today.return_value = date(1999, 1, 1)
mock_timedelta.return_value = timedelta(days=1)
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
> assert useless_date() == date(1999, 1, 2)
test_sample.py:60:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/unittest/mock.py:1081: in __call__
return self._mock_call(*args, **kwargs)
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/unittest/mock.py:1085: in _mock_call
return self._execute_mock_call(*args, **kwargs)
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/unittest/mock.py:1146: in _execute_mock_call
result = effect(*args, **kwargs)
test_sample.py:58: in <lambda>
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/unittest/mock.py:1081: in __call__
return self._mock_call(*args, **kwargs)
E RecursionError: maximum recursion depth exceeded
!!! Recursion detected (same locals & position)
======================================================================================================= short test summary info ========================================================================================================
FAILED test_sample.py::test_useless_date - RecursionError: maximum recursion depth exceeded
Python 版本:Python 3.8.2
【问题讨论】:
标签: python-3.x unit-testing python-import python-unittest