如何仅模拟某些参数的对象/方法

时间:2019-10-03 10:07:12

标签: python pandas python-unittest.mock

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

我有一个方法可以执行一些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时,除了“ now”以外,我还修补了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")的返回值固定为固定日期,而其他所有内容都可以正常解析。

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

0 个答案:

没有答案