Тестирование с несколькими клиентами Django - PullRequest
0 голосов
/ 17 февраля 2019

Я недавно прочитал книгу о TDD на Python и подумал, что могу начать следовать этой схеме.

Но первая проблема уже появилась, и я не могу ее исправить.

HTML-форма (объявлена ​​в forms.py)

Когда я POST и распечатываю ее, я получаю следующий вывод:

<QueryDict: {'csrfmiddlewaretoken': ['...'], 'personal_interests': ['3', '1']}>

Чтобы проверить это представление, в тестах (с использованием клиента Django) я уже попробовал:

response = self.client.post('/', data={'reading': False, 'investing': True, 'traveling': True})

response = self.client.post('/', {'personal_interests': ['3', '1']})

Такжепопробовал как кортеж:

response = self.client.post('/', {'personal_interests': ('3', '1'),})

Но ни один из них, похоже, не отправляет данные, которые я хочу отправить.

Заранее спасибо.

views.py:

def home_page(request):
    default_customer, _ = Customer.objects.get_or_create(name="John", surname="Doe")
    default_customer.interests.clear()
    form = InterestsForm()
    if request.method == 'POST':
        form = InterestsForm(request.POST)
        if form.is_valid():
            for key, value in form.cleaned_data.items():
                for interest in value:
                    filtered_interest, _ = Category.objects.get_or_create(name=interest)
                    default_customer.interests.add(filtered_interest)
            default_customer.save()
            return redirect('/user/'+str(default_customer.id)+'/interests')
        else:
            messages.error(request, "An error has occured. Check all the fields.")
            return redirect('/')
    context = {'form': form}
    return render(request, 'home.html', context)


forms.py:

class InterestsForm(forms.Form):
    personal_interests = forms.ModelMultipleChoiceField(
     widget=forms.CheckboxSelectMultiple,
     queryset=Category.objects.all().order_by('name'),
     required=False,
     label='Interests')

    class Meta:
        model = Category


1 Ответ

0 голосов
/ 18 февраля 2019

Я понял, где была ошибка ... Тестовая база данных и обычная база данных отличаются, поэтому мне не хватало объектов, созданных в базе данных во время тестирования.

Так что все, что мне нужно было сделать, это создать элементы,а затем отправьте POST

response = self.client.post('/', {'personal_interests': ['3', '1']}) WORKS, где '3' и '1' - это pks объектов.

Вот фиксированный код.


def test_can_save_a_POST_request(self):
        Customer.objects.get_or_create(name="John", surname="Doe")
        reading_interest, _ = Category.objects.get_or_create(name="reading")
        investing_interest, _ = Category.objects.get_or_create(name="investing")
        traveling_interest, _ = Category.objects.get_or_create(name="traveling")

        post_data = {'personal_interests': [str(investing_interest.id),
         str(traveling_interest.id)]}

        response = self.client.post('/',
        data=post_data)

        new_customer = Customer.objects.first()
        customer_interests = [category.name for category in new_customer.interests.all()]

        self.assertNotIn('reading', customer_interests)
        self.assertIn('traveling', customer_interests)
        self.assertIn('investing', customer_interests)
...