无法模拟数据库 Django 链查询
Not able to mock the database Django chain queries
我正在尝试模拟 Django 链查询。这些是
1. MyModel.objects.filter(userId=userId).exists()
2. mrvDb = MyModel.objects.filter(userId=userId).order_by('-dateViewed')
.
我正在尝试模拟查询 1。以下是我的方法
@mock.patch('myapp.models.MyModel.objects')
@mock.patch('myapp.models.MyModel.objects')
def test_retrieveMRVListService(self, param, most_Recently_Viewed_List):
mock_MRVList_data = mock.MagicMock(spec=MyModel)
mock_MRVList_data.userId = 6
mock_MRVList_data.policyId = 6
most_Recently_Viewed_List.filter.return_value = [mock_MRVList_data]
# param.filter.return_value = param
param.filter.exists.return_value = "True"
为此。我收到错误:(AttributeError: 'list'
对象没有属性 'exists')
我正在尝试测试这个方法。
def retrieveMRVListService(userId):
if mostRecentlyViewedList.objects.filter(userId=userId).exists():
mrvDb = mostRecentlyViewedList.objects.filter(
userId=userId
).order_by('-dateViewed')[:5]
mrvList = []
for mrv in mrvDb:
mrvData = {}
mrvData["userId"] = mrv.userId
mrvData["policyId"] = mrv.policyId
mrvList.append(mrvData)
else:
mrvList = []
return mrvList
我是 unittest 和 mock/test django 查询的新手。任何人都可以帮助解决链式查询。任何帮助或领导,我将不胜感激。
如果需要任何信息,请告诉我。
您已经完成了大部分工作,这真的很了不起,因为 Python 中的大多数人甚至都不知道如何使用 Mock。真正让你失望的是 most_Recently_Viewed_List.filter.return_value
实际上是一个 List
,它正确地说它没有 "exists" 属性(因为它没有)。
所以按步骤分解它:
- MyModel.objects.filter(userId=userId) return是一个
QuerySet
对象。
- 然后您在第 1 步 returned 的 QuerySet 上调用
exists()
。
因此,当您 patch/mock 一个对象时,您必须正确跟踪实际调用的内容和位置。
您可以做的是 return 在步骤 1 中使用不同的模拟,然后修改该对象的 return 调用,就好像它是原始的 QuerySet
:
mock_queryset = Mock() # Create a mock of the QuerySet
# in Django calling filter() returns a QuerySet, so lets do that
most_Recently_Viewed_List.filter.return_value = mock_queryset
# now modify the return value for the calls you make on that queryset
mock_queryset.exists.return_value = True
mock_queryset.order_by.return_value = [mock_MRVList_data] # just like your original code
如您所见,我们现在实际做的是模拟您在代码中调用的实际内容。
我正在尝试模拟 Django 链查询。这些是
1. MyModel.objects.filter(userId=userId).exists()
2. mrvDb = MyModel.objects.filter(userId=userId).order_by('-dateViewed')
.
我正在尝试模拟查询 1。以下是我的方法
@mock.patch('myapp.models.MyModel.objects')
@mock.patch('myapp.models.MyModel.objects')
def test_retrieveMRVListService(self, param, most_Recently_Viewed_List):
mock_MRVList_data = mock.MagicMock(spec=MyModel)
mock_MRVList_data.userId = 6
mock_MRVList_data.policyId = 6
most_Recently_Viewed_List.filter.return_value = [mock_MRVList_data]
# param.filter.return_value = param
param.filter.exists.return_value = "True"
为此。我收到错误:(AttributeError: 'list' 对象没有属性 'exists')
我正在尝试测试这个方法。
def retrieveMRVListService(userId):
if mostRecentlyViewedList.objects.filter(userId=userId).exists():
mrvDb = mostRecentlyViewedList.objects.filter(
userId=userId
).order_by('-dateViewed')[:5]
mrvList = []
for mrv in mrvDb:
mrvData = {}
mrvData["userId"] = mrv.userId
mrvData["policyId"] = mrv.policyId
mrvList.append(mrvData)
else:
mrvList = []
return mrvList
我是 unittest 和 mock/test django 查询的新手。任何人都可以帮助解决链式查询。任何帮助或领导,我将不胜感激。 如果需要任何信息,请告诉我。
您已经完成了大部分工作,这真的很了不起,因为 Python 中的大多数人甚至都不知道如何使用 Mock。真正让你失望的是 most_Recently_Viewed_List.filter.return_value
实际上是一个 List
,它正确地说它没有 "exists" 属性(因为它没有)。
所以按步骤分解它:
- MyModel.objects.filter(userId=userId) return是一个
QuerySet
对象。 - 然后您在第 1 步 returned 的 QuerySet 上调用
exists()
。
因此,当您 patch/mock 一个对象时,您必须正确跟踪实际调用的内容和位置。
您可以做的是 return 在步骤 1 中使用不同的模拟,然后修改该对象的 return 调用,就好像它是原始的 QuerySet
:
mock_queryset = Mock() # Create a mock of the QuerySet
# in Django calling filter() returns a QuerySet, so lets do that
most_Recently_Viewed_List.filter.return_value = mock_queryset
# now modify the return value for the calls you make on that queryset
mock_queryset.exists.return_value = True
mock_queryset.order_by.return_value = [mock_MRVList_data] # just like your original code
如您所见,我们现在实际做的是模拟您在代码中调用的实际内容。