首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >像urllib这样的模拟/存根python模块

像urllib这样的模拟/存根python模块
EN

Stack Overflow用户
提问于 2008-11-17 12:07:41
回答 8查看 53.9K关注 0票数 75

我需要测试一个函数,该函数需要使用urllib.urlopen (它也使用urllib.urlencode)查询外部服务器上的页面。服务器可能会宕机,页面可能会改变;我不能依赖它进行测试。

控制urllib.urlopen返回内容的最佳方法是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-11-17 12:32:43

另一个简单的方法是让您的测试覆盖urllib的urlopen()函数。例如,如果您的模块具有

代码语言:javascript
复制
import urllib

def some_function_that_uses_urllib():
    ...
    urllib.urlopen()
    ...

你可以这样定义你的测试:

代码语言:javascript
复制
import mymodule

def dummy_urlopen(url):
    ...

mymodule.urllib.urlopen = dummy_urlopen

然后,当您的测试调用mymodule中的函数时,将调用dummy_urlopen()而不是真正的urlopen()。像Python这样的动态语言使得将方法和类存根出来进行测试变得非常容易。

请参阅我在http://softwarecorner.wordpress.com/上的博客文章,了解有关清除测试依赖项的更多信息。

票数 101
EN

Stack Overflow用户

发布于 2010-03-06 23:31:31

我正在使用Mock's补丁装饰器:

代码语言:javascript
复制
from mock import patch

[...]

@patch('urllib.urlopen')
def test_foo(self, urlopen_mock):
    urlopen_mock.return_value = MyUrlOpenMock()
票数 73
EN

Stack Overflow用户

发布于 2008-11-17 12:49:46

你看了Mox一眼吗?它应该能做你需要的一切。下面是一个简单的交互式会话,说明了您需要的解决方案:

代码语言:javascript
复制
>>> import urllib
>>> # check that it works
>>> urllib.urlopen('http://www.google.com/')
<addinfourl at 3082723820L ...>
>>> # check what happens when it doesn't
>>> urllib.urlopen('http://hopefully.doesnotexist.com/')
#-- snip --
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # OK, let's mock it up
>>> import mox
>>> m = mox.Mox()
>>> m.StubOutWithMock(urllib, 'urlopen')
>>> # We can be verbose if we want to :)
>>> urllib.urlopen(mox.IgnoreArg()).AndRaise(
...   IOError('socket error', (-2, 'Name or service not known')))

>>> # Let's check if it works
>>> m.ReplayAll()
>>> urllib.urlopen('http://www.google.com/')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/mox.py", line 568, in __call__
    raise expected_method._exception
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # yay! now unset everything
>>> m.UnsetStubs()
>>> m.VerifyAll()
>>> # and check that it still works
>>> urllib.urlopen('http://www.google.com/')
<addinfourl at 3076773548L ...>
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/295438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档