13

我正在尝试以某种方式模拟 urllib2.urlopen 库,以便我应该为传递给函数的不同 url 获得不同的响应。

我现在在我的测试文件中这样做的方式是这样的

@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'>

而不是实际的反应。请建议我哪里出错了或更简单的方法来做到这一点。

4

1 回答 1

21

to 的参数patch需要是对对象位置的描述,而不是对象本身。因此,您的问题看起来可能只是您需要将参数字符串化为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()

从 shell 运行测试:

$ python test.py
resp1
resp2

编辑:哎呀,最初包括原始错误。(正在测试以验证它是如何被破坏的。)现在应该修复代码。

于 2013-10-06T00:45:30.153 回答