python模拟补丁顶级包

时间:2014-03-30 22:12:52

标签: python unit-testing mocking python-mock

在python中使用mock,顶级包(如argparse)无法直接打补丁 - 大概是因为没有对补丁的引用。一种解决方案是将每个单独的调用修补到包中(如argparse.ArgumentParser)。理论上,如果添加了对包的调用而没有相应的补丁,那么在单元测试期间会导致意外调用导入。

虽然解决方法并不是那么不方便,但最好像argparse那样修补软件包。 mock_open似乎使用了一些恶作剧来使用open()修补内置的__main__.open。这是如何工作的,并且可以使用类似的恶作剧来修补顶级包裹吗?

1 个答案:

答案 0 :(得分:3)

import unittest.mock as mock

mock_argparse = mock.Mock()
with mock.patch.dict('sys.modules', argparse=mock_argparse):
    import argparse
    print(argparse.ArgumentParser()) 
# <Mock name='mock.ArgumentParser()' id='140681471282448'>

至于mock_open补丁:

m = mock_open()
with patch('__main__.open', m, create=True):

它似乎创建了带有模拟对象的__main__.open属性,它隐藏了内置版本,就像在模块中定义了open()函数一样。我想在实际测试中你应该修补module_x.open(),其中“module_x”是实际调用open()的模块。