gpt4 book ai didi

python - 模拟 Django 查询集以测试采用查询集的函数

转载 作者:IT老高 更新时间:2023-10-28 22:00:47 37 4
gpt4 key购买 nike

我的 Django 项目中有一个实用函数,它接受一个查询集,从中获取一些数据并返回一个结果。我想为这个函数写一些测试。无论如何“模拟”一个查询集?我想创建一个不接触数据库的对象,我可以为它提供一个要使用的值列表(即一些假行),然后它就像一个查询集,并允许某人对其进行字段查找/过滤/获取/全部等。

这样的东西已经存在了吗?

最佳答案

对于一个空的查询集,我会简单地使用 none 作为 keithhackbarth has already stated .

然而,为了模拟一个返回值列表的查询集,我更喜欢使用 Mock带有模型经理的 spec。作为示例(Python 2.7 风格 - I've used the external Mock library),这是一个简单的测试,其中查询集被过滤然后计数:

from django.test import TestCase
from mock import Mock

from .models import Example


def queryset_func(queryset, filter_value):
"""
An example function to be tested
"""
return queryset.filter(stuff=filter_value).count()


class TestQuerysetFunc(TestCase):

def test_happy(self):
"""
`queryset_func` filters provided queryset and counts result
"""
m_queryset = Mock(spec=Example.objects)
m_queryset.filter.return_value = m_queryset
m_queryset.count.return_value = 97

result = func_to_test(m_queryset, '__TEST_VALUE__')

self.assertEqual(result, 97)
m_queryset.filter.assert_called_once_with(stuff='__TEST_VALUE__')
m_queryset.count.assert_called_once_with()

然而,为了解决这个问题,而不是为 count 设置 return_value,这可以很容易地调整为模型的 listall 返回的实例。

请注意,链接是通过设置 filter 返回模拟查询集来处理的:

m_queryset.filter.return_value = m_queryset

这需要应用于被测函数中使用的任何查询集方法,例如排除

关于python - 模拟 Django 查询集以测试采用查询集的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362952/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com