Python 使用mock在单元测试中修补休眠
我在模块中有一段代码,如下所示: MyWorker.py: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
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