[英]Use mock to patch sleep in unit test
I have a piece of code sitting in a module like this: 我有一段代码放在这样的模块中:
MyWorker.py: MyWorker.py:
from gevent import sleep
class MyWorker(object):
def run(self):
for _ in range(10):
do_something()
sleep(1)
Then I want to test this while mocking sleep. 然后我想在嘲笑睡觉时测试这个。 I tried multiple ways of doing it but all failed. 我尝试了多种方法,但都失败了。 One way I thought should be working: 我认为应该工作的一种方式:
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()
I tried some more and turns out it's very simple to fix: Change from xyzMyWorker import MyWorker
to from xyzMyWorker import MyWorker, sleep
, or you can do from xyzMyWorker import *
and all unit tests work. 我尝试了一些,结果很简单:修改from xyzMyWorker import MyWorker
from xyzMyWorker import MyWorker, sleep
,或者你可以from xyzMyWorker import *
和所有单元测试工作。 The comment above gave me this idea. 上面的评论给了我这个想法。
This is what I end up doing: 这就是我最终做的事情:
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():
...
This is full working version of the mocking away sleep 这是嘲笑的睡眠的完整工作版本
# 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.