在python中使用mock,顶级包(如argparse)无法直接打补丁 - 大概是因为没有对补丁的引用。一种解决方案是将每个单独的调用修补到包中(如argparse.ArgumentParser)。理论上,如果添加了对包的调用而没有相应的补丁,那么在单元测试期间会导致意外调用导入。
虽然解决方法并不是那么不方便,但最好像argparse那样修补软件包。 mock_open似乎使用了一些恶作剧来使用open()
修补内置的__main__.open
。这是如何工作的,并且可以使用类似的恶作剧来修补顶级包裹吗?
答案 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()
的模块。