django - 测试 django create CBV 时如何修复 Key Error?
问题描述
我已经解决了这个问题 3 天了。我想我缺少一些关于测试创建视图或使用 client.post() 的基本知识。
测试失败,因为表单的cleaned_data 字典中不存在日期键,但是,当从浏览器执行时,代码可以正常工作。
你能告诉我为什么在浏览器中运行时clean_data字典中存在日期键,但在测试中由client.post()执行时不存在?
以下是相关代码的片段。
模型.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)
视图.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)
表格.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
测试.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__
)
追溯
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'...
在浏览器中工作的证明代码
解决方案
推荐阅读
- java - 如何从xml读取值并将其存储在java中的哈希映射中
- laravel - Laravel 数字验证 gte:5 也允许 0
- javascript - 幻灯片不接受属性中指定的宽度
- java - 是否最好为 Mockito 中的每个“何时”调用进行“验证”调用?
- javascript - 如何使表单元素填充表格行并启用表格的编辑、删除和更新按钮
- javascript - 从 vanilla JS 中的两个对象数组创建一个新的对象数组
- jboss7.x - 尝试从 Codeready Studio 12.19.1 停止 JBoss EAP 7.3 时出错
- java - Intellij IDEA 在构建时删除未使用的导入语句
- r - 总结部分单词的R函数?
- windows - 尝试在命令提示符窗口中逐行显示一些 ASCII 艺术作品,但在显示第一行后窗口关闭。我该如何解决?