Найти - Пользователи
Полная версия: Как протестировать декоратор с помошью py.test
Начало » Python для экспертов » Как протестировать декоратор с помошью py.test
1
cavinc
Имеется декоратор.
Декоратор работает и выполняет то что от него требуется.
Возникла необходимость протестировать его с помошью 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()
Сломал всю голову. но догнать не могу как правильно.
py.user.next
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

test_dec.py
#!/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]$
cavinc
Таким образом мы всего лишь протестируем имя функции.
и правильный декоратор но без переопределения через @warp
не будет проходить тест.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB