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

3
我正在使用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个回答

3
通常的方法是设置一个相对较小的数据集,其中包含一些查询应该找到的内容和一些不应该找到的内容。然后检查返回的 QuerySet 并验证:
  1. 它包含了预期的结果数量
  2. 返回的主键值集合与预期返回的值匹配
  3. 返回对象上注释的值是预期的。
例如,您可以执行以下操作:
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
    )

1
RawQuerySet没有.count()方法(它不是一个QuerySet),因此当你的查询与数据库进行交互时,你就要自己摸索了。同时也没有len()方法。我假设我应该先将其转换为一个列表才能得到数量计数? - NickCatal
一般的模式仍然适用。您可以对结果使用 list(),然后对列表执行长度操作等。 - James Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接