我在django中发出了一个调用函数的命令。 该函数执行django orm调用:
def get_notes():
notes = Note.objects.filter(number=2, new=1)
return [x.note for x in notes]
我想修补实际的查找:
@mock.patch('Note.objects.filter', autospec=True)
def test_get_all_notes(self, notes_mock):
get_notes()
notes_mock.assert_called_once_with(number=2, new=1)
我收到以下断言错误:
AssertionError: Expected call: filter(number=2, new=1)
Actual call: filter(number=2, new=1)
我在google和stackoverflow上搜索了几个小时,但我仍然没有线索。 任何人都可以指出我正确的方向,我认为这可能是我犯下的一个明显错误......
答案 0 :(得分:2)
AFAIK你不能像这样使用patch()
。补丁目标应为package.module.ClassName
形式的字符串。我不太了解django,但我认为Note
是一个类,所以Note.objects.filter
不是你可以导入的东西,因此可以在patch()
中使用。我也不认为patch()
可以处理属性。实际上我并不完全理解为什么补丁可以正常工作。
尝试使用专门用于修补类属性的patch.object()
。这意味着您的测试模块中已导入Note
。
@mock.patch.object(Note, 'objects')
def test_get_all_notes(self, objects_mock):
get_notes()
objects_mock.filter.assert_called_once_with(number=2, new=1)
我已删除autospec
,因为我不确定在这种情况下它是否能正常工作。如果有效,你可以试着把它放回去。
另一种选择可能是patch()
使用type(Note.objects)
(可能是某些django类)。
正如我所说,我对django一无所知,所以我不确定这些是否有效。