Как смоделировать объект / метод только для определенных параметров - PullRequest
1 голос
/ 03 октября 2019

Я пишу тест, который утверждает, что определенный метод вызывается с определенными параметрами.

У меня есть метод, который выполняет некоторые вызовы 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") до фиксированной даты, а все остальноеанализируется нормально.

Исправления: внесены изменения в примеры после вопросов.

...