如何在Django中适当地测试ModelForms和视图

时间:2014-10-01 07:27:33

标签: django unit-testing

是否需要为ModelForm创建测试,如下所示?原因是实际上没有代码。

class HouseForm(forms.ModelForm):
    class Meta:
        model = House
        exclude = ['user',]
        fields = ['area', 'num_floors',]

因此,唯一要测试的部分就是检查excludeinclude字段是否没有公共字段。另外,要测试excludeinclude是否包含模型的所有字段,而不是更多。

有意义吗?

另一方面,我想为以下视图编写单元测试。它利用了上面的ModelForm。

是否有可能在不使用某些工具(如Selenium)的情况下编写真正的单元测试,这在某种意义上是功能测试?关键是我不知道如何在视图上传递一些字段值。

@login_required
def update_or_create_house(request, house_id=None):

    if house_id:
        house = request.user.house_set.get(pk=house_id)
    else:
        house = None

    if request.method=="POST":
        form = HouseForm(request.POST, instance=house)
        if form.is_valid():
            result = form.save(commit=False)
            result.user = request.user
            result.save()

            return redirect('houses-viewall')
        else:
            print form.errors
    else:
        form = HouseForm(instance=house)

    return render(request, 'housemgm/edit_house.html', {'form':form, 'house':house,})

最后一个问题:在同一视图中编辑和创建功能是一个好的设计吗?或者我应该将它们分成两部分?

为了完整起见,模型是

class House(models.Model):
    area = models.FloatField()
    owner = models.ForeignKey(User)
    num_floors = models.IntegerField(default=1)

1 个答案:

答案 0 :(得分:6)

首先,不要测试Django本身提供的东西。如果您的模型表单中没有任何自定义代码,请不要对其进行专门测试:模型表单的功能通常已经过Django测试。

要测试您的视图,您可以使用内置的test client模拟视图上的GET和POST。然后,您可以在测试之前和之后对响应的内容以及数据库的状态进行断言。

最后,是的,这是一个很好的视图模式。