Форум сайта python.su
Имеется декоратор.
Декоратор работает и выполняет то что от него требуется.
Возникла необходимость протестировать его с помошью py.test (и только им)
и вот с этим у меня как то не срастается.
вот модуль декоратора
#-*- coding: utf-8 -*- from functools import wraps import threading import time def background_worker(interval): ''' Запускает декорированную функцию в отдельном потоке с задержкой в interval ''' def my_decorator(func): @wraps(func) # корректируем параметр __name__ у оборачиваемой функции def wrapper(): # дополнительная функция на основании которой мы создадим поток def inner(): while True: time.sleep(interval) func() # создаем настраивам и запускаем поток t = threading.Thread(target=inner) t.setDaemon(True) t.start() return wrapper return my_decorator
import pytest from mydecorator import background_worker @background_worker(1) def _job(): print "Job" return 'Job' def test_decorator(): print 'Func Name:'+_job.__name__ assert _job.__name__=='_job','Function Name OK' t_job=_job() if __name__=='__main__': test_decorator()
Офлайн
dec.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from functools import wraps import threading import time def background_worker(interval): ''' Запускает декорированную функцию в отдельном потоке с задержкой в interval ''' def my_decorator(func): @wraps(func) # корректируем параметр __name__ у оборачиваемой функции def wrapper(): # дополнительная функция на основании которой мы создадим поток def inner(): while True: time.sleep(interval) func() # создаем настраивам и запускаем поток t = threading.Thread(target=inner) t.setDaemon(True) t.start() return wrapper return my_decorator
#!/usr/bin/env python # -*- coding: utf-8 -*- import pytest from dec import background_worker @background_worker(1) def _job(): pass def test_decorator(): assert _job.__name__ == '_job', 'Function Name FAIL'
[guest@localhost dec]$ python -m pytest -v
============================= test session starts ==============================
platform linux2 -- Python 2.7.5 -- pytest-2.4.2 -- /bin/python
cachedir: /home/guest/tmp/tests/py/dec/.cache
plugins: pep8, flakes, cache
collected 1 items
test_dec.py:11: test_decorator PASSED
=========================== 1 passed in 0.02 seconds ===========================
[guest@localhost dec]$
Офлайн
Таким образом мы всего лишь протестируем имя функции.
и правильный декоратор но без переопределения через @warp
не будет проходить тест.
Офлайн