【问题标题】:AssertionError, altough the expected call looks same as actual callAssertionError,尽管预期调用看起来与实际调用相同
【发布时间】:2014-09-19 15:41:24
【问题描述】:

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

【问题讨论】:

标签: python django mocking


【解决方案1】:

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,因为我不确定它在这种情况下是否能正常工作。如果可行,您可以尝试将其放回去。

另一种选择可能是在您使用type(Note.objects) 获得的任何东西上使用patch()(可能是一些django 类)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2017-11-16
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多