单元测试中的模拟多处理和检查模拟被调用的次数

2024-09-30 14:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到了下面为在python中模拟多处理调用而提供的函数

class MockPoolApplyResult:
    def __init__(self, func, args):
        self._func = func
        self._args = args

    def get(self, timeout=0):
        return self._func(*self._args)

monkeypatch.setattr("multiprocessing.pool.Pool.starmap",
                lambda self, func, args=(), kwds={}, callback=None, error_callback=None:
                MockPoolApplyResult(func, args))

下面的lambda函数做什么?我如何检查调用它的次数

monkeypatch.setattr("multiprocessing.pool.Pool.starmap",
                lambda self, func, args=(), kwds={}, callback=None, error_callback=None:
                MockPoolApplyResult(func, args))

Tags: lambda函数selfnonedefcallbackargsmultiprocessing
1条回答
网友
1楼 · 发布于 2024-09-30 14:24:57

λ等于:


def mock_starmap(self, func, args=(), kwds={}, callback=None, error_callback=None):
    return MockPoolApplyResult(func, args)

monkeypatch.setattr("multiprocessing.pool.Pool.starmap", mock_starmap)

它用一个具有完全相同参数的函数替换Pool类对象here上的starmap方法

预期的行为可能是,当您拥有my_pool = Pool(3)并运行my_pool.starmap(myfunc, [1,2,3]); my_pool.get()时,它将在当前进程内执行myfunc(1)myfunc(2)myfunc(3),而不是池中的进程执行这些调用。但是看起来它实际上会调用myfunc(1, 2, 3),因为MockPoolApplyResult.get()是如何编写的

编辑。忘记回答问题的第2部分:您无法跟踪monkeypatched函数的调用次数。为此,您需要模拟starmap函数,然后模拟对象将跟踪调用的数量。您可以直接使用内置的unittest.mock模块或使用pytest-mock包装程序包来实现这一点

相关问题 更多 >