Pytest中MagicMock调用方法后DataFrame未修改的原因排查
问题原因及解决思路
MagicMock默认不执行真实逻辑:你用MagicMock创建的
DivergenceCalculator实例,它的get_close_candidates_nearest_open方法只是个空壳——只会记录调用情况和传入参数,不会执行真实方法里修改DataFrame的代码。真实类实例会运行实际的修改逻辑,所以断言能通过,Mock版本自然不会改动你的DataFrame。先验证调用是否正常触发:可以先加一行断言确认Mock方法确实被正确调用,排除“方法根本没执行”的可能:
mock_calculator.get_close_candidates_nearest_open.assert_called_once_with(your_df)让Mock模拟修改行为:如果测试需要验证DataFrame被修改后的结果,得给Mock方法绑定
side_effect,手动实现和真实方法一致的修改逻辑。比如真实方法会给DataFrame新增close_candidates列,就写个函数模拟这个操作:def mock_close_candidates(df): # 复刻真实方法对df的修改逻辑 df['close_candidates'] = df['open'].shift(-1) # 若原方法有返回值,记得返回对应内容 return df mock_calculator = MagicMock(spec=DivergenceCalculator) mock_calculator.get_close_candidates_nearest_open.side_effect = mock_close_candidates区分原地修改和返回新对象:如果真实方法是原地修改DataFrame(比如用了
inplace=True的操作),side_effect里的函数要直接修改传入的df;如果真实方法是返回新的修改后DataFrame,那需要设置return_value为修改后的df实例,同时确保测试逻辑使用返回值而非原df。
内容的提问来源于stack exchange,提问作者BobJones_heavyhitter
相关产品推荐
相关产品推荐

