使用mock来修补单元tes中的睡眠

2024-05-16 16:08:58 发布

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

我在这样的模块中有一段代码:

在我的工人.py公司名称:

from gevent import sleep

class MyWorker(object):
  def run(self):
    for _ in range(10):
      do_something()
      sleep(1)

然后我想在嘲笑睡眠的同时测试这个。我试过多种方法,但都失败了。我认为有一种方法是可行的:

^{pr2}$

Tags: 模块方法代码frompyimport名称object
2条回答

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

我最后要做的就是:

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)

相关问题 更多 >