Нужно смоделировать нетестовый метод в Django

#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. То, что вы упомянули, не является проблемой. Надеюсь, вы видели мой отредактированный вопрос.. Спасибо