小编典典

模拟urllib2.urlopen()。read()获得不同的响应

python

我正在尝试模拟urllib2.urlopen库,以便针对传递到函数中的不同网址获得不同的响应。

我现在在测试文件中执行此操作的方式是这样的

@patch(othermodule.urllib2.urlopen)
def mytest(self, mock_of_urllib2_urllopen):
    a = Mock()
    a.read.side_effect = ["response1", "response2"]
    mock_of_urllib2_urlopen.return_value = a
    othermodule.function_to_be_tested()   #this is the function which uses urllib2.urlopen.read

我希望othermodule.function_to_be_tested在第一次调用时获得值“ response1”,在第二次调用时获得“
response2”,这是side_effect的作用

但是othermodule.function_to_be_tested()收到了

<MagicMock name='urlopen().read()' id='216621051472'>

而不是实际回应。请提出我要去哪里的错误或更简便的方法。


阅读 126

收藏
2021-01-16

共1个答案

小编典典

参数topatch必须是对象 位置 的描述,而不是对象 本身 。因此,您的问题看起来可能只是您需要将参数化为patch

不过,为了完整起见,这是一个完整的示例。首先,我们的模块正在测试:

# mod_a.py
import urllib2

def myfunc():
    opened_url = urllib2.urlopen()
    return opened_url.read()

现在,设置我们的测试:

# test.py
from mock import patch, Mock
import mod_a

@patch('mod_a.urllib2.urlopen')
def mytest(mock_urlopen):
    a = Mock()
    a.read.side_effect = ['resp1', 'resp2']
    mock_urlopen.return_value = a
    res = mod_a.myfunc()
    print res
    assert res == 'resp1'

    res = mod_a.myfunc()
    print res
    assert res == 'resp2'

mytest()

从外壳运行测试:

$ python test.py
resp1
resp2

编辑 :糟糕,最初包含原始错误。(正在测试以确认它是如何损坏的。)现在应该修复代码。

2021-01-16