【发布时间】:2020-02-27 08:12:48
【问题描述】:
我想测试一个表单。它工作正常,但测试没有。
此表单的一个字段由 javascript 函数填充。我可以使用 selenium 来做到这一点,但我不想要,因为它会产生问题,而且我想隔离测试。
所以我在测试中调用表单,然后创建选项(这是 javascript 应该做的),然后设置字段值。
我的models.py:
class Name(models.Model):
name = models.CharField(_('nome'), max_length=50, default='')
namelanguage = models.ForeignKey(
NameLanguage, related_name='%(app_label)s_%(class)s_language',
verbose_name=_('linguaggio'), on_delete=models.PROTECT)
nametype = models.ForeignKey(
NameType, related_name='%(app_label)s_%(class)s_tipo',
verbose_name=_('tipo'), on_delete=models.PROTECT)
gender = models.ForeignKey(
Gender, related_name='%(app_label)s_%(class)s_gender',
verbose_name=_('sesso'), on_delete=models.PROTECT,
blank=True, null=True)
usato = models.PositiveSmallIntegerField(_('usato'), default=0)
approved = models.BooleanField(null=True, blank=True, default=False)
def save(self, *args, **kwargs):
self.name = format_for_save_name(self.name)
to_save = check_gender_name(self)
if not to_save:
return
else:
super(Name, self).save(*args, **kwargs)
def format_for_save_name(name):
myname = name.lower().strip()
if myname[0] not in "abcdefghijklmnopqrstuvwxyz#":
myname = '#' + myname
return myname
我的form.py:
class NameForm(forms.ModelForm):
class Meta:
model = Name
fields = ['namelanguage', 'nametype', 'gender', 'name', 'usato',
'approved']
widgets = {
'gender': forms.RadioSelect(),
'usato': forms.HiddenInput(),
'approved': forms.HiddenInput(),
}
我的test_form.py:
def test_form_validation(self):
maschio = Gender.objects.create(name_en='Male', name_it='Maschio')
nome = NameType.objects.create(name_en='Name', name_it='Nome')
romani = NameLanguage.objects.create(
name_en='Romans', name_it='Romani')
romani.sintassi.add(nome)
form = NameForm()
form.fields['nametype'].disabled = False
form.fields['nametype'].choices = [(nome.id, nome)]
form.fields['nametype'].initial = nome.id
form.fields['gender'].initial = maschio.id
form.fields['name'].initial = 'Bill'
form.fields['namelanguage'].initial = romani.id
# form.fields['usato'].initial = 0
# form.fields['approved'].initial = False
print('1', form)
# self.assertTrue(form.is_valid())
form.save()
print('1', form) 给出了一个没有错误的表单,但 form.is_valid 是 False 并且(当被注释掉时)form.save() 在模型尝试保存名称字段时给出错误:
if myname[0] not in "abcdefghijklmnopqrstuvwxyz#":
IndexError: string index out of range
这是因为名称是一个空字符串,而我的print('1', form) 给出了所有选择正确选项的字段,特别是名称字段不是空的,而是有value="Bill":
<td><input type="text" name="name" value="Bill" maxlength="50" autofocus="" required id="id_name">
编辑。我试图避免检查,其他字段的问题也是一样的:它们在 print('1', form) 上看起来不错,但它们没有到达 form.save(),因为例如在我的print('1', form) 我有:
<tr><th><label for="id_namelanguage">Linguaggio:</label></th><td><select name="namelanguage" required id="id_namelanguage">
<option value="">---------</option>
<option value="1" selected>Romani</option>
所以看起来我选择了一个选项,但后来我收到了这个错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: lists_name.namelanguage_id
【问题讨论】:
-
为什么要标记单元测试?
-
表格有效,测试无效,所以问题与测试有关。什么样的测试?我正在尝试测试我的表单并且我想保持测试隔离,所以它是一个单元测试。使用 Selenium 它将成为一项功能测试,据我所知(对不起,我是新手),因为它涉及视图、模板、javascript 等。
标签: django forms unit-testing testing