你如何对Django RawQuerySets进行单元测试

时间:2018-04-29 01:27:51

标签: django unit-testing django-queryset django-orm python-unittest

我在Django查询中使用raw()annotate(),需要一些方法来测试它。

这是我的代码的样子(这显着简化了)

query = """SELECT
           table1.id, table1.column1, table1.column2,
           table2.other_column1, table2.other_column2 
           FROM myapp_mymodel as table1 
           JOIN otherapp_othermodel as table2 ON table1.othermodel_id = table2.id"""

return MyModel.objects.annotate(
    other_column1=models.Value('other_column1', models.IntegerField()),
    other_column2=models.Value('other_column2', models.DateField())
).raw(query)

使用示例数据填充数据库相对简单,但检查此代码返回数据的最佳方法是什么?

处理RawQuerySets时,处理标准查询集似乎有很多选择。

1 个答案:

答案 0 :(得分:2)

通常,方法是让测试设置一个相对较小的数据集,其中包含查询应该找到的一些内容,以及它应该找不到的一些内容。然后检查返回的QuerySet并验证:

  1. 它包含预期的结果数
  2. 返回的主键值集与预期返回的值相匹配
  3. 返回对象上的注释值是他们预期的值。
  4. 因此,例如,您可能会执行以下操作:

    def test_custom_query(self):
        # Put whatever code you need here to insert the test data
        results = run_your_query_here()
        self.assertEqual(results.count(), expected_number_of_results)
        self.assertEqual({obj.pk for obj in results}, set_of_expected_primary_keys)
        self.assertEqual(
            [obj.annotated_value for obj in results],
            list_of_expected_annotated_values
        )