Django 模型对象不会在测试环境中以 Form 加载

标签 django testing

使用 Django 2.1.3

这里出现一个奇怪的错误;我有一个表单 multiplechoicefield,它从数据库中模型中存在的值中提取选择。

class ChartForm(Form):
    P_CHOICES = tuple((p["p"], p["p"]) for p in VAR.objects.all().values("p"))

    p = MultipleChoiceField(widget=CheckboxSelectMultiple, choices=P_CHOICES, initial=P_CHOICES[0][1])

我正在尝试为项目中的不同应用 运行测试。它抛出以下错误:

  File "/code/pyyc/forms.py", line 31, in ChartForm
    p = MultipleChoiceField(widget=CheckboxSelectMultiple, choices=P_CHOICES, initial=P_CHOICES[0][1])
IndexError: tuple index out of range

我认为这只是因为未加载模型对象。所以我从 VAR 应用程序中添加了固定装置。

然而,它仍然会抛出错误。据推测,表单是在 编译测试数据库之前呈现的......?

所以我现在正在编辑表单,以便手动完成 P_CHOICES,但这显然不适合测试环境。

有人遇到过这个吗?是否有一个聪明的 hack 不涉及在每次要测试时注释掉表单中的行?

最佳答案

我认为你的推测是正确的。类级别属性P_CHOICES在 Python 首次加载 ChartForm 时创建类,在测试实际开始运行之前。这些固定装置稍后作为测试的一部分安装 setUpClass() (由测试框架调用)但到那时 P_CHOICES已经被定义并且是空的。

您可以尝试创建 MultipleChoiceField没有它的 choicesinitial属性,然后在表单的 __init__ 中设置这些属性当数据可用时。例如:

class ChartForm(Form):
    p = MultipleChoiceField(widget=CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        p_choices = tuple((p["p"], p["p"]) for p in VAR.objects.all().values("p"))
        # Now we have the data we can set the attributes
        self.fields['p'].choices = p_choices
        self.fields['p'].initial = p_choices[0][1]

关于Django 模型对象不会在测试环境中以 Form 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997462/

相关文章:

java - 如何创建一个为测试脚本传递参数的 webdriver 函数?

python - Django:如何获取 url 路径?

python - 从同一网络上的另一台计算机访问 Django 网站

python - 将数据从 excel 电子表格导入到 django 模型

ruby-on-rails - Rails 测试套件中显示的数据库调用

ios - 在Xcode中运行应用程序时,如何通过mac传输屏幕和控制设备?

java - 如何在 JUnit 中测试测试 Delete(),如何实际测试 J-Unit

python - 为反向 View 传递 kwargs; Django 1.5

python - Django celery 监视器不显示任何任务

bash - bash 条件中 npm 测试的 grep 结果