【问题标题】:Python Mock Multiple Calls with Different ResultsPython 模拟具有不同结果的多个调用
【发布时间】:2014-06-03 06:23:39
【问题描述】:

我希望能够对特定属性函数进行多次调用,每次连续调用都返回不同的结果。

在下面的示例中,我希望在第一次调用时返回 5,然后在第二次调用时返回 10。

例如:

import mock

class A:
    def __init__(self):
        self.size = 0
    def increment(self, amount):
        self.size += amount
        return amount

@mock.patch("A.increment")
def test_method(self, mock_increment):
    def diff_inc(*args):
        def next_inc(*args):
            #I don't know what belongs in __some_obj__
            some_obj.side_effect = next_inc
            return 10
        return 5

    mock_increment.side_effect = diff_inc

下面的页面几乎包含了我需要的所有内容,除了它假设调用者是一个名为“mock”的对象,但这不能假设。

http://mock.readthedocs.org/en/latest/examples.html#multiple-calls-with-different-effects

【问题讨论】:

标签: python mocking


【解决方案1】:

您可以将一个可迭代对象传递给副作用,并让它遍历您进行的每个调用的值列表。

@mock.patch("A.increment")
def test_method(self, mock_increment):
    mock_increment.side_effect = [5,10]
    self.assertEqual(mock_increment(), 5)
    self.assertEqual(mock_increment(), 10)

【讨论】:

  • 另外,这似乎可行:@mock.patch("A.increment", side_effect=[5, 10])
【解决方案2】:

我测试过,这应该可以工作

import mock

...
...

@mock.patch.object(ClassB, 'method_2')
@mock.patch.object(ClassA, 'method_1')
def test_same_method_multi_return_value(self, method_1, method_2):
    # type: () -> None

    method_1.return_value = 'Static value'
    method_1.side_effect = [
        'Value called by first time'
        'Value called by second time'
        '...'
    ]

版本

https://mock.readthedocs.io/en/latest/
mock>=2.0.0,<3.0

【讨论】:

    【解决方案3】:

    我认为从列表方法中弹出值会更直接。 以下示例适用于您要执行的测试。

    此外,我之前在使用 mock 库时遇到过困难,发现 mock.patch.object() 方法通常更易于使用。

    import unittest
    import mock
    
    
    class A:
        def __init__(self):
            self.size = 0
    
        def increment(self, amount):
            self.size += amount
            return amount
    
    incr_return_values = [5, 10]
    
    
    def square_func(*args):
        return incr_return_values.pop(0)
    
    
    class TestMock(unittest.TestCase):
    
        @mock.patch.object(A, 'increment')
        def test_mock(self, A):
            A.increment.side_effect = square_func
    
            self.assertEqual(A.increment(1), 5)
            self.assertEqual(A.increment(-20), 10)
    

    【讨论】:

    • 这就是我要找的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2013-06-16
    相关资源
    最近更新 更多