导入时调用模拟函数

时间:2014-03-24 17:52:44

标签: python unit-testing mocking

我有一个我需要测试的模块,它会在导入时调用一个函数,但由于各种原因我无法调用此函数。所以我在嘲笑这个函数,但即使是模拟它也会调用import。

例如,我正在测试mod1.py,如下所示:

import os

def bar():
    return 'foo'

def dont_call():
    os.listdir("C:\\tmp")

dont_call()

我的测试看起来像这样:

import mock

@mock.patch("mod1.dont_call")
def test_mod1(mock_dont_call):
    import mod1
    assert mod1.bar()=='foo'

if __name__=="__main__":
    test_mod1()

问题是os.listdir被调用。

我无法更改mod1所以我该怎么办?

我正在使用python2.7。

要把它放在上下文中我正在测试一个在导入时打开数据库连接的模块,我不同意但是我可以看到它背后的原因。不幸的是,我无法在QA机器上访问此数据库。

2 个答案:

答案 0 :(得分:2)

如果您希望在导入时执行'not'代码,请将它们置于以下条件中:

在mod1.py中,执行以下操作:

if __name__=="__main__":
    dont_call()

这是因为,默认情况下,当您导入python模块时,其中的所有代码都会被执行。通过添加上述条件,您明确指出仅当文件作为脚本运行而不是在其他模块中导入时才调用dont_call()。

答案 1 :(得分:0)

我找到的解决方法是嘲笑dont_call打电话给我的东西:

import mock

@mock.patch("os.listdir")
def test_mod1(mock_dont_call):
    import mod1
    assert mod1.bar()=='foo'

if __name__=="__main__":
    test_mod1()