【问题标题】:python mocks a function properly, however the call count is not accountedpython 正确地模拟了一个函数,但是没有计算调用计数
【发布时间】:2021-02-15 04:53:04
【问题描述】:

我有一个像下面这样的课程:

Class a:
    def fn1(self):
        p1=multiprocessing.Process(self.fn2, (arg1,)
        p1.start()
        p1.join()
    def fn2(self, arg1):
        …

我正在尝试对其进行测试,并且我已经模拟了 self.fn2 调用:

测试:

Class aTest(unittest.TestCase):
    def testfn1(self):
        a obj1
        obj1.fn2 = MagicMock.mock()
        obj1.fn1()
        obj1.fn2.assert_called_once_with(arg1)

当我运行测试时,我注意到函数 fn2(我没有看到我在那里的调试)已被模拟。但是,call_count 为 0。如何进一步调试?

【问题讨论】:

  • 如果您创建一个Minimal, Reproducible Example,您将更有可能获得更好的帮助——人们可以复制、粘贴到.py 文件中并运行它。

标签: python python-unittest.mock magicmock


【解决方案1】:

该函数在与主进程不同的进程中运行。因此,您的主进程没有调用self.fn2 的记录。

如果您想继续这条路线,这个库可能适合您。它在进程之间同步模拟的状态。 https://github.com/elritsch/python-sharedmock


但是:我鼓励您采用“GIVEN, THEN, WHEN”的方法来编写您的测试 - 这可能会让您更容易看出什么是合适的测试,并且意味着您不再需要多处理安全MagicMock 实现。您尝试验证的代码的实际行为是什么?如何将其转换为断言?

要在这里测试所需的行为,也许您可​​以根据一组不同的标准进行断言。例如,对self.fn2 的调用是否应该对主进程或文件系统中的某些内容产生影响?如果是这样,您可以改为反对。

【讨论】:

  • 感谢您回来。我有一个后续问题,所以即使在子进程上下文中调用函数 fn2 ,它仍然会被模拟;但是主进程不知道在子进程上下文中调用了模拟的 fn2?
  • 是的 - 试试这段代码,看看模拟函数在新进程中运行。 tio.run/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多