Python 使用mock在单元测试中修补休眠

Python 使用mock在单元测试中修补休眠,python,unit-testing,mocking,Python,Unit Testing,Mocking,我在模块中有一段代码,如下所示: MyWorker.py: from gevent import sleep class MyWorker(object): def run(self): for _ in range(10): do_something() sleep(1) 然后我想在模拟睡眠的时候测试一下。我尝试了多种方法,但都失败了。我认为有一种方法应该有效: from mock import patch from x.y.z.MyWorker imp

我在模块中有一段代码,如下所示:

MyWorker.py:

from gevent import sleep

class MyWorker(object):
  def run(self):
    for _ in range(10):
      do_something()
      sleep(1)
然后我想在模拟睡眠的时候测试一下。我尝试了多种方法,但都失败了。我认为有一种方法应该有效:

from mock import patch
from x.y.z.MyWorker import MyWorker

class TestWorker(unitest.testCase):
  def Test_my_worker(self):
    with patch('x.y.z.MyWorker.sleep'):
      a = MyWorker()
      a.run()

我又尝试了一些,结果发现修复起来非常简单: 将
从x.y.z.MyWorker导入MyWorker
更改为
从x.y.z.MyWorker导入MyWorker,睡眠
,或者您可以从x.y.z.MyWorker导入*执行
,所有单元测试都可以工作。上面的评论给了我这个想法

这就是我最终要做的:

from x.y.z.MyWorker import MyWorker, sleep

Class TestMyWorker(unittest.TestCase):

  def setUp(self):
    self.patcher = patch('x.y.z.MyWorker.sleep')
    self.patcher.start()

  def tearDown(self):
    self.patcher.stop()

  def Test_my_worker_success():
    MyWorker().run()

  def Test_my_worker_fail():
    ...

这是模拟睡眠的完整工作版本

# TestMyWorker.py
#!/usr/bin/python
import unittest
import mock

# myWorker.py MyWorker(class)
from myWorker import MyWorker

class TestWorker(unittest.TestCase):

    # myWorker.py - mock away sleep
    @mock.patch('myWorker.sleep')
    def test_my_worker(self, mock_sleep):
        # mock away the sleep()
        mock_sleep.return_value = False
        worker = MyWorker()
        # should run witout calling sleep()
        worker.run()
        self.assertFalse(mock_sleep.sleep.called,"Fail - sleep really called!")

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(TestWorker)
    unittest.TextTestRunner(verbosity=2).run(suite)

你能试着将
从x.y.z.
行移动到
之后的补丁…
一行吗?看起来这个代码可以用了。。。你确定这等同于对你不起作用的代码吗?@rodrigo你的技巧奏效了。但是对于每个单元测试,我应该如何做呢?然后问题是,我应该如何修补在该模块中导入的睡眠函数,而不是在单元测试中导入的睡眠函数?这个答案毫无意义:如果它起作用,问题中的代码也应该起作用。如果
导入睡眠
使其起作用,你应该在
MyWorker.py