我有一个模块需要在python中测试。
我正在使用unittest框架,但我遇到了一个问题。
该模块有一些方法定义,其中一个在导入时使用(readConfiguration),如下所示:
.
.
.
def readConfiguration(file = "default.xml"):
# do some reading from xml
readConfiguration()
这是一个问题,因为当我尝试导入模块时,它还会尝试运行“readConfiguration”方法,该方法使模块和程序失败(测试环境中不存在配置文件)。
我希望能够独立于任何配置文件测试模块。
我没有写模块,不能重新计算。
我知道我可以包含一个虚拟配置文件,但我正在寻找一种“更干净”,更优雅的解决方案。
答案 0 :(得分:1)
正如评论者已经指出的那样,进口不应该有副作用,所以尽量让模块改变。
如果你真的,绝对不能这样做,可能还有另一种方法:让readConfiguration()
被调用,但是它会依赖它。例如,如果它使用内置open()
函数,您可以模拟它,如mock
documentation中所示:
>>> 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()
的实现,但如果没有其他方法,它可能是最后的手段。