Обойти декоратор с макетом в тесте Django - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь написать простой тест, однако мои представления украшены вложенными утверждениями user_passes_test.Они проверяют такие вещи, как полосовая подписка и is_authenticated.Я нашел различные посты, такие как this , в которых рассказывается, как обойти декоратор с патчем, но я не совсем понимаю, как интегрировать все вместе.

tests.py

@patch('dashboard.views.authorised_base_user_checks', lambda func: func)
def test_dashboard_root_exists(self):
    response = self.client.get('/dashboard/')
    self.assertEqual(200, response.status_code)

декоратор в представлениях

def authorised_base_user_checks(view_func):
    decorated_view_func = login_required(user_active(subscriber_exists(subscriber_valid(view_func))))
    return decorated_view_func

views.py

@authorised_base_user_checks
def IndexView(request):
    ...

Выше все равно не удается пройти черездекоратор.

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

Этот подход с исправлениями декоратора, скорее всего, не работает, потому что импорт модуля views происходит после исправления.Если view уже был импортирован, декоратор уже был применен к IndexView, и исправление функции декоратора не будет иметь никакого эффекта.

Вы можете перезагрузить модуль представления, чтобы преодолеть это:

import imp
import dashboard.views

@patch('dashboard.views.authorised_base_user_checks', lambda func: func)
def test_dashboard_root_exists(self):
   # reload module to make sure view is decorated with patched decorator
   imp.reload(views)

   response = self.client.get('/dashboard/')
   self.assertEqual(200, response.status_code)

   # reload again
   patch.stopall()
   imp.reload(views)

Отказ от ответственности: этот код только демонстрирует идею.Необходимо убедиться, что stopall и окончательная перезагрузка всегда происходят, поэтому они должны быть в finally или в tearDown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...