1

我正在编写一个测试,断言使用某些参数调用某个方法。

我有一个方法可以进行一些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")固定日期,而其他所有内容都正常解析。

编辑:在提问后对示例进行了更改。

4

0 回答 0