Форма всегда недействительна при запуске в pytest - PullRequest
1 голос
/ 24 сентября 2019

У меня проблема с попыткой получить действительную форму в pytest.Я проверяю изменения данных с помощью действия администратора Django.Независимо от того, какие данные я отправляю в форму, form.is_valid() всегда будет возвращать False.Передача словаря в форму напрямую работает, однако я хотел бы иметь возможность протестировать действие, чтобы убедиться, что действие отфильтровывает заблокированные записи.

# test_admin.py

@pytest.mark.django_db
class BaseTestCase(TestCase):
    """Base TestCase with utilites to create user and login client."""

    def setUp(self):
        """Class setup."""
        self.index_url = '/'
        self.login()
        self.django_db_setup()

    def create_user(self):
        """Create user and returns username, password tuple."""
        username, password = 'testadmin', 'password123'
        user = User.objects.create_superuser(
            username,
            'admin@test.com',
            password,
            first_name='Admin',
            last_name='Account',
        )
        self.user = user
        return (username, password)

    def login(self):
        """Log in client session."""
        username, password = self.create_user()
        self.client.login(username=username, password=password)

    @staticmethod
    def django_db_setup():
        call_command('loaddata', 'fixtures/fixture.json')


class AdminTestCase(BaseTestCase):

    def test_responsible_list(self):
        products = Product.objects.filter(pk__in=[230005, 229724])
        form_data = {
            'action': 'set_product_class',
            'apply': 'Submit',
            'product_class': '1',
            ACTION_CHECKBOX_NAME: products.values_list('pk', flat=True),
        }
        self.client.post('/admin/store/product/', form_data, follow=True)
        # Assert product_classes have changed


# actions.py

def set_product_class(modeladmin, request, queryset):
    # Exclude products that are locked
    queryset = queryset.exclude(is_locked=True)
    form = None
    if 'apply' in request.POST:
        form = SetProductClassForm(data=request.POST)
        if form.is_valid():
           # action code


# forms.py

class SetProductClassForm(forms.Form):
    _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
    product_class = forms.ModelChoiceField(ProductClass.objects.all())

Я поместил трассировку pdb над строкойв действии, где он проверяет if form.is_valid():

Когда я запускаю это в pytest:

(Pdb) form.is_valid()
False
(Pdb) request.POST
<QueryDict: {u'action': [u'set_product_class'], u'apply': [u'Submit'], u'product_class': [u'1'], u'_selected_action': [u'230005', u'229724']}>

Однако, если я запускаю тот же код через оболочку Django, форма действительна:

(Pdb) form.is_valid()
True
(Pdb) request.POST
<QueryDict: {u'action': [u'set_product_class'], u'apply': [u'Submit'], u'product_class': [u'1'], u'_selected_action': [u'230005', u'229724']}>

Почему я не могу получить действительную форму через pytest?

1 Ответ

1 голос
/ 24 сентября 2019

Проверка form.errors выдала следующее:

{'product_class': [u'Select a valid choice. That choice is not one of the available choices.']}

Проблема была вызвана тем, что данные, выбранные в форме ProductClass, отсутствовали в приборе.Добавление данных в тестовую базу данных устранило проблему.

...