LINUX.ORG.RU

pytest+django - замокать декоратор вьюхи

 , ,


1

1

Привет, ЛОР.

Чет не работает мок декоратора (продолжает использоваться оригинальный).

Есть вьюха:

# myapp.views.py
from my_utils import my_decorator

@my_decorator
def some_view(request):
    pass


Есть тест на нее (с использованием pytest, pytet-django и putest-mock):

def test_some_view(mocker, client):
    mocker.patch(
        'my_utils.my_decorator',
        return_value=True
    )
    response = client.get(url)
    assert response.status_code == 200


Но в итоге декоратор не мокается, падает с ошибкой, так как пытается заюзать оригинальную логику, которая в декораторе используется. ЧЯДНТ?


Нууу. Декоратор это прост функция. К моменту когда твой тест делает мок декоратора в модуле, функция оригинального декоратора уже отработала и положила свой результат в some_view. Мокай саму функцию. Или какие-нибудь внутренности декоратора(если есть такая возможность)

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от Aswed

Мокаю внутрянку декоратора - нифига, таже ошибка, так как внутрянка продолжает быть оригинальной.

djnoob
() автор топика
Последнее исправление: djnoob (всего исправлений: 1)

Как минимум изначально попытка неверная.

Импортируется как from my_utils import my_decorator, а патчится по пути my_utils.my_decorator.

Если патчить модуль, экспортирующий функционал, тогда вот так делается

import my_utils


@my_utils.my_decorator
def some_view(request):

Но это работать все равно не будет, потому что патчить надо до того как происходит первый заход в модуль views. Теоретически можно, но не нужно.

Наиболее простой способ в этой ситуации вынести кусок функционала наружу и патчить по пути my_utils.new_func_to_patch

qaqa ★★
()
def _some_view(request):
   pass

some_view = my_decorator(_some_view)

в тесте импортишь _some_view, оборачиваешь в свой мок и всё.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.