#python #django #django-templates #django-testing
Вопрос:
У меня есть 100 HTML-шаблонов, которые я должен протестировать, и я не знаю, как протестировать каждый отдельный, чтобы убедиться, что они загружаются правильно. Я предполагаю, что я бы использовал цикл for в своем проекте urls.py но когда я это делаю, я получаю следующую ошибку:
Ошибка атрибута: объект ‘URLResolver’ не имеет атрибута ‘имя’
from django.test import SimpleTestCase, TestCase, Client from django.test.utils import setup_test_environment from django.urls import reverse, URLPattern from django.conf import settings import importlib from foo.urls import urlpatterns # Create your tests here. class LoginTest(SimpleTestCase): def login_view_test(self): client = Client() for url in urlpatterns: response = client.get(reverse(url.name)) self.assertEqual(response.status_code, 200) print(str(reverse(url.name)) " Status Code:" str(response.status_code))
По какой-то причине в коде говорится, что у URLResolver нет атрибута имени, я чувствую, что эта ошибка говорит мне, что мне нужно искать в другом месте, чтобы изменить имя, я просто не знаю, где искать.
при удалении .name в обратном теге я получил эту ошибку:
lt;URLResolver lt;модуль «учетная запись.url» из «/home/company/company_project/account/urls.py’gt; (Нет:Нет) ‘учетная запись/’lt;модуль ‘учетная запись.url-адреса’ от ‘/home/company/company_project/account/urls.py’gt;gt;
Ответ №1:
Вам не нужно называть urlpattern
имя.
Например:
... path('someurl/', generic.RedirectView.as_view(url='/anyurl/')), ...
в результате URLPattern
получается без имени
lt;URLPattern 'someurl/'gt; # no name
В вашем случае вы, вероятно, могли бы напрямую использовать сохраненный маршрут:
from django.test import SimpleTestCase, TestCase, Client from django.test.utils import setup_test_environment from django.urls import reverse, URLPattern from django.conf import settings import importlib from foo.urls import urlpatterns # Create your tests here. class LoginTest(SimpleTestCase): def login_view_test(self): client = Client() for urlpattern in urlpatterns: if urlpattern.name is None: continue response = client.get(urlpattern.pattern._route)) self.assertEqual(response.status_code, 200) print(str(reverse(url.name)) " Status Code:" str(response.status_code))
Имейте в виду, что это не работает, если вы передали некоторые параметры, такие как первичные ключи.
Вероятно, это еще не лучшие решения, так как мы используем внутренний атрибут, но это решает вашу проблему 🙂
Комментарии:
1. Хорошо, что делать, если я хочу пропустить URL-шаблоны, у которых нет имени.
2. Добавьте
if urlpattern.name is None: continue
-gt; Я обновил ответ 🙂3. @Кейд, это помогло?
4. После запуска этого я также столкнулся с проблемой, что он не просматривает каждый включенный URL-файл, поэтому я взял код из другого сообщения о переполнении стека и объединил его с вашим, чтобы получить тот, который выполнял бы все URL-адреса, даже включенные, но да, ваш код помог!