【问题标题】:patch does not work with different import statement补丁不适用于不同的导入语句
【发布时间】:2020-10-27 08:52:26
【问题描述】:

我的问题与以下代码sn-ps有关。在第一个中,我使用“from ... import ...”样式导入 time.sleep:

from time import sleep

class Tests( unittest.TestCase ):
    def test_sleep( self ):
        with patch( "time.sleep" ) as sleepMock:
            sleep( 0.01 )
            sleepMock.assert_called_with( 0.01 )

对于第二个,我使用“import ...”样式:

import time

class Tests( unittest.TestCase ):
    def test_sleep( self ):
        with patch( "time.sleep" ) as sleepMock:
            time.sleep( 0.01 )
            sleepMock.assert_called_with( 0.01 )

第二个按预期运行良好。但第一个不是修补 time.sleep。为什么第一个不起作用,尽管我正在导入相同的功能?成功模拟'time.sleep' 的第一个示例中的补丁语句会是什么样子? 甚至更好:有没有办法修补这个模块,与我如何在生产代码中导入 time.sleep 函数无关?

【问题讨论】:

  • 您正在使用模块命名空间中的sleep。您还必须在模块级别上进行路径:patch( "sleep" )。总是路径是你使用的东西,而不是它来自哪里。
  • @KlausD。我不完全明白你的意思。你能分享一些示例代码吗?
  • 评论中有示例代码!

标签: python python-unittest python-mock


【解决方案1】:

测试用例 1:

from time import sleep
import unittest
from unittest.mock import patch


class Tests(unittest.TestCase):
    def test_sleep(self):
        with patch("__main__.sleep") as sleepMock:
            sleep(0.01)
            sleepMock.assert_called_with(0.01)


if __name__ == '__main__':
    unittest.main()

结果:

python3 64550935-a.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

测试用例 2:

import time
import unittest
from unittest.mock import patch


class Tests(unittest.TestCase):
    def test_sleep(self):
        with patch("time.sleep") as sleepMock:
            time.sleep(0.01)
            sleepMock.assert_called_with(0.01)


if __name__ == '__main__':
    unittest.main()

结果:

python3 64550935-b.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

看看patch官方文档的例子。

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 2011-06-13
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2017-03-11
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多