Тест для пользовательской функции ModelAdmin с параметрами GET
Я пытаюсь написать тест для следующей функции modelAdmin:
def response_add(self, request, obj, post_url_continue=None):
""" Redirects to the public profile details page after creation if return=true """
if request.GET.get('return'):
return redirect(reverse('public_profile_details', kwargs={'id': obj.id}))
else:
return redirect('/admin/public/publicprofile/')
Цель этого - когда сотрудники заходят в панель администратора с веб-страницы по ссылке "Редактировать" (а не непосредственно из панели администратора), я хочу вернуть их на эту страницу после сохранения объекта. Я делаю это, прикрепляя ?return=True к ссылке администратора.
Однако у меня возникают трудности с написанием теста для этого.
Это самое близкое, чего я добился:
def test_admin_functions(self):
self.login_privileged_user()
self.GET = {'return': True}
public_profile_model_admin = admin.PublicProfileAdmin(model=models.PublicProfile, admin_site=AdminSite())
response = self.client.get('/admin/public/publicprofile/1/change/?return=True')
public_profile_model_admin.response_add(self, response, models.PublicProfile.objects.get(id=1))
Однако, это приводит к следующей ошибке:
AttributeError: 'TemplateResponse' object has no attribute 'id'
Я могу немного манипулировать им (меняя self.client.get на self.client.post) и получать различные другие ошибки, такие как ошибка HttpResponse, ошибка HttpResponseRedirect и т.д. Но все они имеют одну и ту же ошибку "object has no attribute 'id'".
Я знаю, что могу использовать Selenium для этого, но я пытаюсь избежать этого для моих небольших тестов, насколько это возможно.
Неважно, я понял это, используя следующее:
def test_admin_functions(self):
""" Test redirects after save/delete """
self.login_privileged_user()
public_profile_model_admin = admin.PublicProfileAdmin(model=models.PublicProfile, admin_site=AdminSite())
response = self.client.get('/admin/public/publicprofile/1/change/?return=True')
admin_response = public_profile_model_admin.response_add(request=response.wsgi_request,
obj=models.PublicProfile.objects.get(id=1))
self.assertEquals(admin_response.status_code, 302)
Разница была в доступе к .wsgi_request ответа