【问题标题】:simulate multiple returns from method with multiple calls using different parameter values?使用不同的参数值模拟多次调用的方法的多次返回?
【发布时间】:2022-01-04 00:54:30
【问题描述】:

我想测试仅将有效文件添加到有效文件计数中,如下所示:

self.n_valid_files = 0
for file in self.list_of_files:
    n_paras = self.count_paras(file)
    if n_paras != None:
        self.n_valid_files += 1

如果出现问题,count_paras 返回 None

有没有办法修补和测试:即在self.list_of_files 中提供多个给定文件,然后说count_paras 应该返回一个特定值?

即类似:

my_test_dict = {'filename1': 3, 'filename2': 30, 'filename3': None}
with mock.patch.object(project, 'count_paras') as mock_count:
    mock_count.return_value = my_test_dict[what-might-go-here?] # this doesn't work of course
    project.process_files(my_test_dict.keys())
    ...

...问题是多次调用count_paras 而只有一次调用process_files

【问题讨论】:

  • 您可以使用side_effect 代替return_value 来提供将在后续调用中使用的返回值列表。

标签: python mocking pytest python-unittest patch


【解决方案1】:

如果您想在后续调用中从模拟函数返回不同的值,可以使用side_effect。在这种情况下,side_effect 获取一个用作返回值的值列表(也可以为 side_effect 使用一个可调用对象,然后调用它,但这是一个不相关的用例)。

在您的示例中,您已经有了要用作返回值的示例字典的值:

def test_count_paras():
    project = Project()
    my_test_dict = {'filename1': 3, 'filename2': 30, 'filename3': None}
    with mock.patch.object(project, 'count_paras') as mock_count:
        mock_count.side_effect = my_test_dict.values()
        project.process_files(my_test_dict.keys())
        assert project.n_valid_files == 2

这里发生的情况是,每次调用模拟的 count_paras 都会返回传递给 side_effect 的列表中的下一个值,因此在您的情况下为 3、30 和 None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多