2015-03-13 36 views
13

Jestem nowy w django i mam problemy z testowaniem niestandardowych działań (np. Actions = ['mark_as_read']), które są w rozwijanym menu app_model_changelist, jest to to samo menu rozwijane z standard "usuń wybrane". Niestandardowe akcje działają w widoku administratora, ale po prostu nie wiem, jak wywołać to w mojej fałszywej prośbie, wiem, że muszę opublikować dane, ale jak mam powiedzieć, że chcę zrobić akcję "mark_as_read" na opublikowanych danych?Testowanie niestandardowych czynności administracyjnych w django

Chcę zmienić adres URL listy zmian i opublikować zestaw zapytań, aby funkcja "mark_as_read" przetworzyła dane, które opublikowałem.

change_url = urlresolvers.reverse('admin:app_model_changelist') 
response = client.post(change_url, <QuerySet>) 
+0

Próbuję to powtórzyć. Jak wygląda twój adres urls.py w tej aplikacji? Innymi słowy: skąd pochodzi 'admin: app_model_changelist'? – physicalattraction

+0

Nieważne, znalazłem go już tutaj: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#admin-reverse-urls – physicalattraction

Odpowiedz

18

Po prostu wprowadź parametr action z nazwą akcji.

response = client.post(change_url, {'action': 'mark_as_read', ...}) 

Sprawdzone pozycje są przekazywane jako parametr _selected_action. Więc kod będzie tak:

fixtures = [MyModel.objects.create(read=False), 
      MyModel.objects.create(read=True)] 
should_be_untouched = MyModel.objects.create(read=False) 

#note the unicode() call below 
data = {'action': 'mark_as_read', 
     '_selected_action': [unicode(f.pk) for f in fixtures]} 
response = client.post(change_url, data) 
+0

Wielkie dzięki, działało idealnie! – user2106729

+1

Aby uczynić go nieco bardziej niezawodnym, możesz użyć 'django.contrib.admin.ACTION_CHECKBOX_NAME' zamiast' "_selected_action" '. –

3

To co mam zrobić:

data = {'action': 'mark_as_read', '_selected_action': Node.objects.filter(...).values_list('pk', flat=True)} 
response = self.client.post(reverse(change_url), data, follow=True) 
self.assertContains(response, "blah blah...") 
self.assertEqual(Node.objects.filter(field_to_check=..., pk__in=data['_selected_action']).count(), 0) 

kilka uwag na ten temat, w porównaniu z przyjętym odpowiedź:

  • Możemy wykorzystać values_list zamiast rozumienia list w celu uzyskania identyfikatorów.
  • Musimy określić follow=True ponieważ oczekuje się, że po powiodło doprowadzi do przekierowania
  • Opcjonalnie dochodzić do udanego wiadomości
  • sprawdzić, czy zmiany rzeczywiście są odzwierciedlone na db.