mock queryset in Django unittest



我有样例代码和测试:

def outer():
inner_response = inner(param1)
def inner(something):
queryset_response = something.object.filter(foo="bar", 
foo1="bar1") #this should get a reponse when testing.
response_list = []
for count, queryset_res in enumerate(queryset_response):
response_list.append(queryset_response[count].data)
#get response for data in this line.
return response_list    

我想使用mock测试这种情况,如果可能的话,可能会使用mock返回查询集的列表。

def setup():
something = mock.Mock()
def test_outer():
# what should be done to the below line work so that 
# response_list.append gets some value.
something.objects.filter()[0].data = "some string"
# Also is it possible to return queryset as like shown below.
something.objects.filter().return_value = <queryset>  # list of objects in queryset.

我使用了一个mock并返回了namedtuple,使其表现得像queryset,并使用(.)dot来访问数据集。我可以创建一个类,并以同样的方式使用它。

def test_func():
something = mock.Mock()
key = collections.namedtuple('key', 'data')
response = key('some_string')
something.objects.filter.return_value = [response]

就像gloo说的那样,这有点嘲弄django,我的前工程师决定这样做。

你不应该嘲笑过滤器的结果,因为这就像对django本身进行单元测试一样。相反,您应该测试将调用Model.object.filter的您自己的函数。您可以创建将在单元测试设置中使用的对象,并断言当您调用函数时,预期的结果与这些对象相同。例如:

def my_own_function(foo, foo1):
queryset_response = Something.objects.filter(foo=foo, foo1=foo1)
store = queryset_response[0].data
return store

和在单元测试中:

def test_my_own_function():
data = "mydata"
sample_obj = Something.objects.create(foo="bar", foo1="bar1", data=data)
result = my_own_function("bar", "bar1")
self.assertEqual(result, data)

最新更新