2015-12-31 4 views
3

У меня есть кусок кода, сидящего в модуле, как это:Используйте макет для заплаты сна в единичном испытании

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() 
+0

Вы можете попробовать перемещение 'от xyz..' линии только после того, как 'с патчем ...' один? – rodrigo

+0

Похоже, этот код будет работать ... вы уверены, что это эквивалентно коду, который не работает для вас? – augurar

+0

@rodrigo Ваш трюк работает. Но как это сделать для каждого модульного теста? И тогда возникает вопрос, как следует исправить функцию сна, импортированную в этом модуле, но не импортированную в модульный тест? – user1537085

ответ

0

Я попробовал несколько больше и оказывается, что это очень просто исправить: Изменить 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(): 
    ... 
+0

Этот ответ не имеет смысла: если он работает, код в вопросе тоже должен работать. –

+0

Если 'import sleep' заставляет его работать, у вас должна быть какая-то ленивая инициализация в' MyWorker.py' –

0

Это полный рабочий вариант насмешливым прочь сна

# 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) 
Смежные вопросы