嘲笑单元测试的网址

时间:2016-06-16 12:11:56

标签: python unit-testing urllib2

我想模拟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')

2 个答案:

答案 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作为方法的参数而不是全局变量 - 它使测试变得更加容易。