Я хочу протестировать функцию async_who
с помощью pytest.
Как проверить вызов обратного вызова и возвращаемое значение «Боб»
import threading
def async_who(callback):
t = threading.Thread(target=_who, args=(callback,))
t.start()
def _who(callback):
return callback('Bob')
def callback(name):
print(name)
return name
async_who(callback)
Потому что async_who
не вернул значение. Я не могу этого сделать,
def test_async_who():
res = async_who(callback)
assert res == 'Bob'
пул потоков из многопроцессорного модуля или ThreadPoolExecutor (для версии Python >= 3.2) способы получить возвращаемое значение потока.
from concurrent.futures import ThreadPoolExecutor
def async_who(callback):
executor = ThreadPoolExecutor(max_workers=2)
res = executor.submit(_who, callback)
return res.result()
def _who(callback):
return callback('Bob')
def callback(name):
print(name)
return name
def test_async_who():
res = async_who(callback)
assert res == 'Bob'
from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=2)
def async_who(callback):
res = pool.apply_async(_who, args=(callback,))
return res.get()
def _who(callback):
return callback('Bob')
def callback(name):
print(name)
return name
def test_async_who():
res = async_who(callback)
assert res == 'Bob'
Даже если это выглядит очень просто, ваш тест слишком сложен. Тестируйте каждую функцию отдельно и имитируйте то, что вы не тестируете. Например,
Thread
уже хорошо протестирован, проверьте, что вы делаете правильный вызов, а не то, что вызов работает (создает поток).