我有一个模块需要用python测试。
我正在使用单元测试框架,但我遇到了一个问题。
该模块有一些方法定义,其中一个在导入(readConfiguration)时使用,如下所示:
.
.
.
def readConfiguration(file = "default.xml"):
# do some reading from xml
readConfiguration()
这是一个问题,因为当我尝试导入模块时,它还尝试运行"readConfiguration"方法,该方法使模块和程序失败(测试环境中不存在配置文件)。
我希望能够独立于任何配置文件测试模块。
我没有编写模块,也无法重构。
我知道我可以包含一个虚拟配置文件,但我正在寻找一个"更干净"、更优雅的解决方案。
正如评论者已经指出的那样,导入不应该有副作用,所以如果可能的话,尝试更改模块。
如果你真的,绝对,不能这样做,可能还有另一种方法:让readConfiguration()
被调用,但存根它的依赖项。例如,如果它使用内置的open()
函数,你可以模拟它,如mock
文档中所示:
>>> mock = MagicMock(return_value=sentinel.file_handle)
>>> with patch('builtins.open', mock):
... import the_broken_module
... # do your testing here
如果需要提供实际内容,请将sentinel.file_handle
替换为StringIO("<contents of mock config file>")
。
它很脆弱,因为它取决于readConfiguration()
的实现,但如果真的没有其他方法,它可能是有用的最后的手段。