簡體   English   中英

使用Mock Python返回Iterable

[英]Return Iterable With Mock Python

我正在嘗試使用Mock來模擬python中的一個函數。 這是我的代碼:

    resp, content = request(...)

request()函數需要返回兩個值。 這是我試過的:

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

但是當我運行測試時,我得到錯誤“模擬對象不可迭代”。 請求函數返回Mock類型的對象而不是列表。 如何修改請求函數以便返回列表?

我懷疑你的問題是你沒有使用你認為自己的模擬實例。 默認情況下,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'

請注意披露,我是新來的模擬,所以我不是專家,但是,我剛遇到同樣的問題,發現將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM