Как исправить Key Error при тестировании django создания CBV? - PullRequest
0 голосов
/ 03 апреля 2020

Я устранял эту проблему в течение 3 дней. Я думаю, что упускаю что-то фундаментальное в тестировании Create Views или использовании client.post ().

Тест не пройден, потому что ключ даты отсутствует в словаре cleaned_data формы, однако код работает правильно при выполнении из браузера.

Подскажите, пожалуйста, почему ключ даты присутствует в словаре cleaned_data при запуске в браузере, но отсутствует при выполнении client.post () в тесте?

Ниже приведены фрагменты соответствующего кода.

Models.py

class Livestock(CommonInfo):
    """Model definition for Livestock. CommonInfo is an abstract model that contains  
    created_by, modified_by, date_created, date_modified and comment fields"""

    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, related_name='livestock')
    date = models.DateField(
        auto_now=False, auto_now_add=False)
    production = models.PositiveIntegerField(
        'Livestock produced (Kg or litre or #)')
    number_of_animal = models.PositiveIntegerField(
        'Number of Animals (Quantity)', blank=True, null=True)
    cost_of_production = models.PositiveIntegerField(
        'Cost of Production (GYD)', blank=True, null=True)

views.py

class LivestockCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
    model = Livestock
    form_class = LivestockForm
    success_url = reverse_lazy('real:livestock-list')
    template_name = "real/livestock/livestock_form.html"
    permission_required = ('real.add_livestock')

    def get_initial(self):
        initial = super(LivestockCreateView, self).get_initial()
        initial['date'] = timezone.now()
        return initial

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super().form_valid(form)

Forms.py

class LivestockForm(forms.ModelForm):
"""Form definition for Livestock."""

class Meta:
    """Meta definition for Livestockform."""

    model = Livestock
    fields = ['product', 'date', 'production',
              'number_of_animal', 'cost_of_production', 'comment', 
              'modified_by', 'created_by']

    widgets = {
        'date': forms.DateInput(attrs={'type': 'date'}),
        'modified_by': forms.HiddenInput(),
        'created_by': forms.HiddenInput(),
    }

def clean(self):
    self.cleaned_data = super(LivestockForm, self).clean()
    self._validate_unique = True
    self.cleaned_data['date'] = self.cleaned_data['date'].replace(day=1)
    return self.cleaned_data

test.py

class LivestockTests(TestCase):
@classmethod
def setUpTestData(cls):
    cls.User = get_user_model()
    cls.user = cls.User.objects.create_user(
        username='test_user',
        password='testpass123',
        first_name='test',
        last_name='user'
    )

    cls.product = Product.objects.create(
        name='Milk'
    )


def test_livestock_create_view_user_is_login_and_have_permission(self):
    self.user.user_permissions.add(
        Permission.objects.get(codename='add_livestock'))
    login = self.client.login(username='test_user', password='testpass123')

    response = self.client.post((reverse('real:livestock-create'),
                                {'product': self.product.id,
                                 'date': timezone.now(),
                                 'production': 5200
                                 })

    view = resolve('/sector/real/livestock/create')

    self.assertTrue(login)
    self.assertEqual(response.status_code, 200)
    self.assertTemplateUsed(response, 'real/livestock/livestock_form.html')
    self.assertContains(response, 'Livestock')
    self.assertNotContains(response, 'Sugar')
    self.assertEqual(
        view.func.__name__,
        views.LivestockCreateView.as_view().__name__
    )

traceback

D:\MOF\Projects\guyanaeconomicsectoranalysis>docker-compose exec web python manage.py test real
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.E............
======================================================================
ERROR: test_livestock_create_view_user_is_login_and_have_permission 
(real.tests.tests_livestock.LivestockTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Projects/real/tests/tests_livestock.py", line 875, in 
test_livestock_create_view_user_is_login_and_have_permission
'production': 5200
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 543, in post
response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 357, in post
secure=secure, **extra)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 422, in generic
return self.request(**r)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 503, in request
raise exc_value
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in 
_get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in 
_get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/mixins.py", line 52, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/mixins.py", line 85, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/edit.py", line 141, in post
if form.is_valid():
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 185, in is_valid
return self.is_bound and not self.errors
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 180, in errors
self.full_clean()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 382, in full_clean
self._clean_form()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 409, in _clean_form
cleaned_data = self.clean()
File "/Projects/real/forms.py", line 140, in clean
self.cleaned_data['date'] = self.cleaned_data['date'].replace(day=1)
KeyError: 'date'

----------------------------------------------------------------------
Ran 14 tests in 0.791s

FAILED (errors=1)
Destroying test database for alias 'default'...

Код подтверждения, работающий в браузере

proof code working in the browser

...