Тестовый пример Django с недопустимым URL, но выдающий 200
при запуске сервера разработки (py manage.py runserver), и браузера пользователя с url "localhost:8000//index.html", он выдает 404.
но при выполнении теста client.get('//index.html') выдает 200, и содержимое такое же, как при запросе на ('/').
при запуске сервера разработки, используя оболочку py manage.py, затем из django.test import Client, прямой запуск дает тот же результат.
Так это проблема функции Client.get()? Или я неправильно ее использую?
def test_invalid_url2(self):
response=self.client.get('//index.html')
self.assertEqual(response.status_code, 404)
URL с несколькими косыми чертами вполне допустим. (См. RFC 2396 для всех технических подробностей). Однако не все программы относятся к ним одинаково. Здесь вы видите разницу между поведением браузера и тестового клиента Django.
В конце концов, вы должны спросить себя, что вы действительно тестируете здесь? Действительно ли вам важно, как обрабатываются двойные слэши? Это кажется деталью, которую лучше оставить django, чтобы он разбирал как хочет, и оставить разработчикам django тестировать это поведение.
Ваш тест должен проверять только поведение вашего собственного приложения. Для своих собственных приложений я проверяю, что маршруты возвращают 200, когда они доступны. Или если я явно запрещаю доступ с помощью разрешений Django, то я напишу тест, который будет возвращать 403 или 404 в зависимости от ситуации.
Кроме того, я никогда не использую явные пути в своих тестах. Вместо этого я использую reverse()
для поиска пути к заданному имени.