我有样例代码和测试:
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)