补丁不适用于不同的导入语句

patch does not work with different import statement

我的问题与以下代码片段有关。在第一个中,我使用“from ... import ...”-style 导入 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 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' 的第一个示例中的 patch 语句会是什么样子? 甚至更好:有没有办法修补这个模块,与我如何在我的生产代码中导入 time.sleep 函数无关?

测试用例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例子