我想模拟urllib.urlopen来创建单元测试
def url_test(self):
response = urllib2.urlopen(test_url)
body = response.read()
if body:
return body.split(':')[0]
config.py
test_url = "localhost"
我想模拟url_test()函数,但我不明白如何模拟test_url的值。因为当我试图对功能进行单元测试时,它会说我"连接被拒绝"
这就是我的尝试。
@patch('urllib.urlopen')
def url_test(self, m_url):
m_response = m_url.return_value
m_response.read.return_value = 'Some body value:you wanted to return'
self.assertTrue(url_test(), "Failed")
m_url.assert_called_with('localhost')
答案 0 :(得分:1)
你会模拟任何外部系统,这里是urllib2
。假设您正在使用unittest.mock
library(向后移植到Python 2作为mock
project):
with mock.patch('urllib2.urlopen') as urlopen_mock:
mock_response = urlopen_mock.return_value
mock_response.read.return_value = 'Some body value:you wanted to return'
# call the method being tested
result = someobject.url_test()
# make assertion about the return value and that the code tried to use
# a specific URL
urlopen_mock.assert_called_with('localhost')
self.assertEqual(result, 'Some body value')
在您的更新中,您模拟了错误的位置:
@patch('urllib.urlopen')
您的代码使用的是urllib2
,而不是urllib
。
答案 1 :(得分:0)
对于使用Python模拟Web请求,我强烈推荐HTTPretty。
您想要做的事情的简单示例如下所示:
@httpretty.activate
def test_url():
httpretty.register_uri(httpretty.GET, test_url,
body='some body value:some other value',
content_type="text/plain")
self.assertEqual(url_test(), 'some_body_value')
有许多复杂的东西和陷阱都伴随着模拟URL请求,而HTTPretty在幕后实现它们方面做得非常好。
就您的功能而言,考虑将test_url
作为方法的参数而不是全局变量 - 它使测试变得更加容易。