python-3.x - Python用“=”调用模拟未调用结果
问题描述
我正在尝试模拟以下调用:
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']
解决方案
您看到这种不同行为的原因取决于= 0
您在测试的调用结束时是否有 on ,因为在Python 的 data model中,它们对应于两种不同的魔术方法:__getitem__
和__setitem__
.
这是有道理的,因为例如做some_dictionary['nonexistent_key]'
raises 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)
如果您尝试为该键分配值,则该方法有效。请注意额外的参数,也对应于您实际尝试分配的值。
推荐阅读
- python - python从列表中删除单引号和空格
- redis - 尝试调用字段“replicate_commands”(零值)
- java - 尝试在任何布局中添加笔触宽度时,MaterialButton 是不可见的
- ruby-on-rails - 需要实现#cache!如果你想使用 Cloudinary::CarrierWave::Storage 作为缓存存储
- python - 使用一个类,其方法由另一个目录中的@ray.remote 修饰
- google-app-engine - 将 Rasa 与 Google Cloud Platform 一起使用时,Dockerfile 中应包含哪些内容
- javascript - 从android react-native + expo的手机本地存储加载图像
- r - 从R中的特殊字符中删除引号
- java - 在 java lambdas 的帮助下,重构方法来清理许多 if else
- python - 绘图点分散得足够远并将它们连接起来