用Python模拟导入的模块

时间:2014-12-08 11:52:45

标签: python unit-testing mocking

我有一个名为' com'进行低级串行通信。高级模块使用此模块进行通信。 我试图为这些模块添加适当的单元测试,但我不想让测试依赖于串行通信。 所以我需要嘲笑' com'模块,模拟来自串行通信的响应。

手动我只需更改导入行就可以了:

import mymodule.com

类似于:

import mymodule.mocked_com as com

但我知道这不是一个好方法......所以试图使用mock.patch装饰,但没有成功:

@mock.patch('mymodule.com', returns=(True, 'Test'))
def test_myfunction(capsys):
    result, message = controller.myfunction('Something', 'command')
    assert(result)
    assert(message == 'Test')
    out, err = capsys.readouterr()

由于某些原因,我从来没有从" com"返回所需的结果,但收到错误:" ValueError:需要超过0的值才能解压"。

1 个答案:

答案 0 :(得分:2)

mock.patch装饰器正在模拟您提供的相对路径。这意味着,如果您以这种方式导入和使用com,则在模块X中进行测试:

import com
com.my_awesome_call()

在X模块的测试中,你应该以这种方式补丁(考虑到X在源头):

@mock.patch('X.com', ...)
def test_myfunct(mock_com):
    # Boom Badaboom test things