我正在开发一个项目,如果我可以在测试期间模拟urlopen
,那将非常方便。有人向我指出,通过嘲笑opener
并使用urllib2.install_opener
可以(而且很容易)。
但是,由于文档中的这一说明,我很担心:
安装OpenerDirector实例作为默认的全局开启者。
这是否意味着如果我依赖的其他代码使用urlopen
,我的程序可能会意外中断?
答案 0 :(得分:0)
其含义正是您所期望的。在您退出计划或再次致电urllib2.urlopen
之前,您计划中对install_opener
的所有后续通话都将使用您的开启者。
这是否“危险”取决于您的使用案例。如果你的代码的其他部分正在使用urllib2.open
并且你不想让它们被嘲笑,那么是的,这是一个坏主意,因为它们会被嘲笑。
在这种情况下,您必须获取要模拟的代码才能调用my_opener.open
而不是urllib2.open
。如果您设计要测试的代码,这应该很容易。如果你需要事后monkeypatch代码,它有点棘手,但有各种可能性。例如,如果要模拟给定模块中的所有调用,只需替换foomodule.urllib2 = my_opener
并设置my_opener.urlopen = my_opener.open
。