我正在编写一个测试,断言使用某些参数调用某个方法。
我有一个方法可以进行一些pandas.Timestamp()
调用,其中一些包括pandas.Timestamp("now")
. 这就是问题出现的地方。
class MyClass(object):
def my_method(start, stop):
start = start if pd.isna(start) else pd.Timestamp(0)
stop = end if pd.isna(end) else pd.Timestamp("now")
result = self.perform_calc(start, stop)
return result
def perform_calc():
pass
当我修补pd.Timestamp
时,除了“现在”之外,我还为 0-case 修补它。我怎样才能制作一个补丁,使其在pd.Timestamp
所有其他情况下都正常运行pd.Timestamp("now")
?
我试图做一个side effect
功能:
def side_effect(t):
if t == "now":
return pd.Timestamp("2019-01-01")
else:
return pd.Timestamp(t)
但似乎一旦pd.Timestamp
被修补,这也被修补,所以我得到一个递归错误。
@patch("my_module.pd.Timestamp", side_effect=side_effect)
@patch("my_module.MyClass.perform_calc")
def test_my_method(self, mock_ts, mock_calc):
start = pd.Timestamp("NaT")
stop= pd.Timestamp("NaT")
my_class = my_module.MyClass()
my_class.my_method(start, stop)
mock_calc.assert_called_once_with(
pd.Timestamp(0), pd.Timestamp("2019-01-01")
)
基本上,我想将返回值固定为pd.Timestamp("now")
固定日期,而其他所有内容都正常解析。
编辑:在提问后对示例进行了更改。