Я пишу тест, который утверждает, что определенный метод вызывается с определенными параметрами.
У меня есть метод, который выполняет некоторые вызовы 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 в дополнение к «сейчас». Как я могу сделать патч, где 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")
до фиксированной даты, а все остальноеанализируется нормально.
Исправления: внесены изменения в примеры после вопросов.