python - 使用 Django 客户端多个复选框进行测试

标签 python django-forms django-testing

我最近读了一本关于 Python 中的 TDD 的书,并认为我可以开始遵循这种模式。

但是第一个问题已经出现了,我似乎无法解决它。

HTML form (declared in forms.py)

当我发布并打印它时,我得到以下输出:

<QueryDict: {'csrfmiddlewaretoken': ['...'], 'personal_interests': ['3', '1']}>

为了测试这个 View ,进入测试(使用 Django 客户端)我到目前为止已经尝试过:

response = self.client.post('/', data={'reading': False, 'investing': True, 'traveling': True})

response = self.client.post('/', {'personal_interests': ['3', '1']})

还尝试作为元组:

response = self.client.post('/', {'personal_interests': ('3', '1'),})

但是这些似乎都没有发送我想要发送的数据。

提前致谢。

views.py:

def home_page(request):
    default_customer, _ = Customer.objects.get_or_create(name="John", surname="Doe")
    default_customer.interests.clear()
    form = InterestsForm()
    if request.method == 'POST':
        form = InterestsForm(request.POST)
        if form.is_valid():
            for key, value in form.cleaned_data.items():
                for interest in value:
                    filtered_interest, _ = Category.objects.get_or_create(name=interest)
                    default_customer.interests.add(filtered_interest)
            default_customer.save()
            return redirect('/user/'+str(default_customer.id)+'/interests')
        else:
            messages.error(request, "An error has occured. Check all the fields.")
            return redirect('/')
    context = {'form': form}
    return render(request, 'home.html', context)


forms.py:

class InterestsForm(forms.Form):
    personal_interests = forms.ModelMultipleChoiceField(
     widget=forms.CheckboxSelectMultiple,
     queryset=Category.objects.all().order_by('name'),
     required=False,
     label='Interests')

    class Meta:
        model = Category


最佳答案

我已经弄清楚错误出在哪里...测试数据库和普通数据库不同,所以我在测试时缺少在数据库中创建的对象。

所以我需要做的就是创建项目,然后发送 POST

response = self.client.post('/', {'personal_interests': ['3', '1']}) 有效,其中 '3' 和 '1' 是 pks对象的数量。

这是固定代码。


def test_can_save_a_POST_request(self):
        Customer.objects.get_or_create(name="John", surname="Doe")
        reading_interest, _ = Category.objects.get_or_create(name="reading")
        investing_interest, _ = Category.objects.get_or_create(name="investing")
        traveling_interest, _ = Category.objects.get_or_create(name="traveling")

        post_data = {'personal_interests': [str(investing_interest.id),
         str(traveling_interest.id)]}

        response = self.client.post('/',
        data=post_data)

        new_customer = Customer.objects.first()
        customer_interests = [category.name for category in new_customer.interests.all()]

        self.assertNotIn('reading', customer_interests)
        self.assertIn('traveling', customer_interests)
        self.assertIn('investing', customer_interests)

关于python - 使用 Django 客户端多个复选框进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54736481/

相关文章:

python - 如何干净地将常量与函数关联起来?

python - 索引超出范围,但列表中有元素?

python - 如何以编程方式在 Django 的 ModelForm 中设置字段?

database - 可以在 heroku postgresql 中删除一行吗?

python - 在 Django 中测试 url 重定向

django - Django 测试用例中的线程没有关闭数据库连接

python - Cx_Freeze - 如何包含模块

python - pygame.error : SavePNG: could not open for writing?

Django ModelForm is_valid() 错误类型

Django 测试在 postgres hstore 迁移时失败