gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:40:32 25 4
gpt4 key购买 nike

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

最佳答案

据我所知,您不能像这样使用 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,因为我不确定它在这种情况下是否能正常工作。如果有效,您可以尝试将其放回原处。

另一种选择可能是对通过 type(Note.objects) 获得的任何内容(可能是一些 django 类)使用 patch()

正如我所说,我对 django 了解不多,所以我不确定这些东西是否有效。

关于python - AssertionError,尽管预期调用看起来与实际调用相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com