#python #django #unit-testing #celery #django-celery
#python #django #модульное тестирование #сельдерей #django-сельдерей
Вопрос:
У меня есть тестовый класс, похожий на приведенный ниже:
@mock.patch('myapp.apps.mytask1.views.image_processing.apply_async')
class SortAPITestCase(APITestCase):
def hit_scan("""some args"""):
scan_uri = 'some url'
data = 'some data'
resp = self.client.post(scan_uri, data=data)
id = resp.data['id']
self.assertEqual(resp.status_code, 201)
return data, id
def setUp(self):
super(SortAPITestCase, self).setUp()
self.scan_data, self.id = self.hit_scan()
def test_1(self, mock_obj):
.....
def test_2(self, mock_obj):
.....
Внутри myapp.apps.mytask1.views
есть API сканирования, где есть post
метод, который вызывает задачу сельдерея, например:
def post("""some args"""):
""" here there is a celery task that gets called"""
image_processing.apply_async(
args=[img_data], queue='image', countdown=10
)
Задача celery выводит сообщение при вызове примерно так, как показано ниже
@shared_task
def image_processing(img_data):
if os.isfile(img_file):
print "File Not Present"
Итак, всякий img_file
раз, когда его нет, он выводится File Not Present
. Когда тестовые функции (с макетом) отправляются в Scan API, это сообщение печати не печатается на консоли из-за макета. Но hit_scan()
метод, когда отправляет сообщения в Scan API, тогда это сообщение печатается, поскольку задача сельдерея не издевается. Могу ли я издеваться над задачей сельдерея hit_scan
??
Итак, есть ли способ предотвратить появление инструкции print в консоли при запуске теста??
Кстати, все тестовые примеры проходят. С этой точки зрения проблем нет. Я просто хотел, чтобы консоль выглядела лучше, только ....
вместо того, чтобы появлялись операторы печати из задачи сельдерея.
Редактировать: решена проблема. Вот что я сделал
@mock.patch('myapp.apps.mytask1.views.image_processing.apply_async')
def hit_scan(self, mock_obj, """some args"""):
Ответ №1:
Это не имеет ничего общего с тем, что метод находится за пределами теста; Python не делает такого различия. Однако ваш синтаксис для издевательства неверен: вам нужно ссылаться на то, что вы хотите издеваться, через путь к модулю Python, а не путь к файлу.
@mock.patch('path.something.file.apply_async')
Комментарии:
1. Я отредактировал вопрос с фактическим
mock.patch()
. Когдаhit_scan()
функция вызывается вtest_
функции, она не выводит оператор в задаче сельдерея. Я это проверил..2. То, что вы упомянули, не является проблемой. Надеюсь, вы видели мой отредактированный вопрос.. Спасибо