【问题标题】:Can I use side_effect in my mocking to provide an indefinite number of values?我可以在我的模拟中使用 side_effect 来提供无限数量的值吗?
【发布时间】:2022-01-19 00:46:01
【问题描述】:

所以我可以在 python 模拟中使用带有 side_effect 的迭代来生成我对模拟的调用返回的变化值:

some_mock.side_effect = [1, 2, 3]

return_value 每次都提供相同的值

some_mock.return_value = 8

有没有一种方法可以使用这些方法中的一种或两种,以便模拟生成一些计划值开始,然后在第一组用尽时产生一个特定值的无限响应?即:

[1, 2, 3, 8, 8, 8, 8, 8, 8, 等等等等]

【问题讨论】:

    标签: python-3.x python-unittest python-mock


    【解决方案1】:

    没有特定的内置功能可以做到这一点,但您可以通过添加执行此操作的副作用来实现。

    在我能想到的情况下,只需添加一些所需的最高值而不是无限数量就足够了,并使用带有列表的side_effect 版本:

    side_effect = [1, 2, 3] + [8] * 100
    my_mock.side_effect = side_effect
    

    如果您确实需要无限数量的响应,您可以使用 side_effect 的另一个版本,它使用函数对象而不是列表。您需要一些生成器函数来创建无限列表,并在函数中对其进行迭代,记住当前位置。这是一个示例实现(使用类来避免全局变量):

    from itertools import repeat
    
    class SideEffect:
        def __init__(self):
            self.it = self.generator()  # holds the current iterator
    
        @staticmethod
        def generator():
            yield from range(1, 4)  # yields 1, 2, 3
            yield from repeat(8)  # yields 8 infinitely
    
        def side_effect(self, *args, **kwargs):
            return next(self.it)
    
    ...
    my_mock.side_effect = SideEffect().side_effect
    

    这应该有想要的效果。

    【讨论】:

    • 谢谢,这是有道理的。这样做的好处是在单元测试中模拟 time.time() ,这样它们就不必永远运行,特别是在不同的时间间隔测试不同的行为时。
    猜你喜欢
    • 2013-09-01
    • 2011-08-09
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多