Python使用“ =”调用模拟而不调用结果

时间:2019-03-13 12:29:14

标签: python-3.x pandas mocking pytest assertion

我正在尝试模拟以下呼叫:

df_x = method() # returns a pandas dataframe
df_x.loc[df_x['atr'] < 0, 'atr'] = 0

我已经模拟了该方法,因此它会返回MagicMock并将默认值设置为MagicMock的__ getitem__属性,如下所示:

mock_df_x = mock_method.return_value
mock_df_x.__getitem__.return_value = 0

问题是当我尝试断言呼叫时:

mock_df_x.loc.__getitem__.assert_called_with(False, 'atr')

我得到了一个不称为错误的函数。如果我这样调用没有“ = 0”部分的函数,则断言有效。

df_x.loc[df_x['atr'] < 0, 'atr']

1 个答案:

答案 0 :(得分:1)

根据您正在测试的通话结束时是否有= 0来看到这种不同行为的原因是,在Python's data model中,这些行为对应于两种不同的魔术方法:{{ 3}}和__getitem__

这是有道理的,因为例如进行some_dictionary['nonexistent_key]'会引发KeyError,而some_dictionary['nonexistent_key]' = 1不会,并按预期设置值。

现在,为了修复您的测试,您只需更改以下内容的断言即可:

mock_df_x.loc.__getitem__.assert_called_with((False, 'atr'))

仅在您访问密钥时有效,以:

mock_df_x.loc.__setitem__.assert_called_with((False, 'atr'), 0)

在您尝试为该键分配值时有效。 还要注意额外的参数,它与您实际尝试分配的值相对应。