【问题标题】:Is it possible to 'fill' a form like this?是否可以“填写”这样的表格?
【发布时间】: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_validFalse 并且(当被注释掉时)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


【解决方案1】:

我不知道为什么以及如何,但是这段代码可以工作:

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.syntax.add(nome)
    form = NameForm({'nametype': nome.id, 'gender': maschio.id,
                     'name': 'Remo', 'namelanguage': romani.id})
    form.fields['nametype'].initial = nome.id
    form.save()
    self.assertEqual(Name.objects.all().count(), 1)
    my_name = Name.objects.first()
    self.assertEqual(my_name.name, 'remo')
    self.assertEqual(my_name.nametype, nome)
    self.assertEqual(my_name.gender, maschio)
    self.assertEqual(my_name.namelanguage, romani)

任何评论将不胜感激

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多