Django 中的 TDD,如何对我的模型进行单元测试?

TDD in Django, how to unit test my modelform?

我是 TDD 新手,正在尝试在 Django 项目中应用 TDD 实践。

基于伦敦学校的 TDD 工作流程,我正在从外向内、视图层、表单层和模型层工作。在表单层,我计划构建一个模型表单,其中包含一些 自定义验证方法。我认为,基于 TDD,我只需要测试我的自定义方法, 不碰:

但是我该怎么做呢?例如,使用以下模型形式:

from django import forms
from app import models

class MyModelForm(forms.ModelForm):

    class Meta:
        model = models.MyModel
        fields = ("field1", "field2")

    def clean_field1(self):
        # custom cleaning logic

    def clean_field2(self):
        # custom cleaning logic

    def clean(self):
        # custom cleaning logic

当使用像django 这样的框架时,编写单元测试很棘手。问题是模型和表单通过 django 设计非常紧密地耦合在一起。通过此处耦合,我的意思是例如表单期望模型中存在特定字段。

鉴于模型本身很少有任何逻辑并且通常只是字段的定义,我会说将表单与模型一起测试而不是模拟它更实用。在大多数情况下,您在表单中定义的逻辑测试将仅取决于字段的定义。

但是回到你的问题。

你可以做一个纯粹主义者,嘲笑模特。为了单独测试表单,您需要模拟模型,但有点不同。您不需要使用纯 Mock,而是需要创建另一个测试模型,其中包含此表单可以使用的模型的最小定义。该测试模型在表单和模型之间建立了一种契约。即此表单期望模型具有哪些字段。然后在你的测试中你应该用测试模型模拟模型。

您可以使用增量步骤的常规 TDD 实践来做到这一点。这是从表单开始,对一个字段进行测试,然后创建(最初为空)测试模型,并在表单中为它们创建测试时一个一个地添加字段。

当然,您仍然需要一个(或多个)集成测试来检查您的表单是否适用于真实模型。

这里有一点很重要。你是对的,你不应该测试 django 提供的逻辑。但不代表你的测试不能依赖和使用它。

这同样适用于您自己的代码。形式测试不应该直接测试你的模型,但从实际的角度来看,它可以依赖于真实的模型(假设模型逻辑本身也在它自己的测试中被测试)。有人会争辩说这不是纯粹的单元测试,而是您为使用 the Web framework for perfectionists with deadlines.

付出的代价