如何通过 side_effecting 其属性模拟对象列表

How to mock a list of objects by side_effecting its attribute

我想对以下函数进行单元测试,该函数将 RunInfo 个对象列表作为参数。

def get_mses(runs):
    mse = []
    for r in runs:  
        metrics = mlflow.get_run(r.run_id).data.metrics
        mse.append(metrics['cv_mse'])
    
    return mse

虽然主要逻辑围绕 metrics,但确实需要迭代 runs 并获取属性 run_id 以检索有关每个 运行 的信息。但是我认为我不需要模拟实际的 RunInfo class,而是模拟一些具有属性 run_id 的假 class。如何通过使用 side_effects?

将 run_ids 指定为简单的 (1, 2, 3) 来模拟它并创建对象列表

我找到了这个 post,但这并不是我想要做的。

您不必为此目的使用 side_effectsunittest.mock 有一个 NonCallableMock class 可以包含任意属性。

from unittest import mock

runs = [mock.NonCallableMock(run_id=i) for i in range(1,4)]