AssertionError,尽管预期的调用看起来与实际调用相同

时间:2014-07-28 12:40:40

标签: python django mocking

我在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上搜索了几个小时,但我仍然没有线索。 任何人都可以指出我正确的方向,我认为这可能是我犯下的一个明显错误......

1 个答案:

答案 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一无所知,所以我不确定这些是否有效。