Python 使用“=”调用 mock 未调用结果

Python calling mock with "=" not called result

我正在尝试模拟以下调用:

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

我已经模拟了该方法,因此它 returns 一个 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']

你看到这种不同行为的原因取决于你是否在你正在测试的调用结束时有 = 0 是在 Python's data model, those correspond to two different magic methods: __getitem__ and __setitem__.

这是有道理的,因为例如执行 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)

如果您尝试为该键分配一个值,这会起作用。 还要注意额外的参数,对应于您实际尝试分配的值。