【问题标题】:Return Iterable With Mock Python使用 Mock Python 返回可迭代对象
【发布时间】:2011-06-15 19:42:04
【问题描述】:

我正在尝试使用 Mock 来模拟 python 中的函数。这是我的代码:

    resp, content = request(...)

request() 函数需要返回两个值。这是我尝试过的:

    with patch("syncdatetime.py") as sync_mock:
        sync_mock.request.return_value = [obj, '']

但是当我运行测试时,我收到错误“Mock object is not iterable”。 request 函数返回一个 Mock 类型的对象而不是一个列表。如何修补请求函数以使其返回列表?

【问题讨论】:

    标签: python mocking


    【解决方案1】:

    我怀疑您的问题是您没有使用您认为的模拟实例。默认情况下,Mock 的实例在调用时会返回一个 Mock。

    >>> m = mock.Mock()
    >>> type(m())
    <class 'mock.mock.Mock'>    
    

    看起来您对 request 的调用返回了一个 Mock,因为 return_value 尚未初始化,这意味着 resp, content = request() 正在尝试解压缩 Mock 对象。

    >>> m = mock.Mock()
    >>> (a, b) = m()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'Mock' object is not iterable
    

    您不需要使用side_effect 来返回列表。分配return_value 应该可以工作。

    >>> m = mock.Mock()
    >>> m.return_value = ['a', 'b']
    >>> (a, b) = m()
    >>> a
    'a'
    >>> b
    'b'
    

    【讨论】:

      【解决方案2】:

      披露说明,我是模拟新手,所以我不是专家,但是,我刚刚遇到了同样的问题,发现将 side_effect 属性设置为返回数组的函数可以解决问题

      从您的示例代码中,更改:

      with patch("syncdatetime.py") as sync_mock:
          sync_mock.request.return_value = [obj, '']
      

      with patch("syncdatetime.py") as sync_mock:
          sync_mock.request.side_effect = function_returning_list
      

      并定义

      def function_returning_list(arg_list_of_choice):
          #anything you want to do goes here
          #then
          return your_list
      

      【讨论】:

      • 我没有尝试过,但我确实找到了一个更简单的解决方案。不要修补模块,而是修补函数本身,然后设置 patch.return_value。老实说,我不完全确定为什么会这样,但是这样,函数不会返回 Mock 对象。不过,感谢您的回复。
      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多