2014-03-30 73 views
3

在Python中使用mock,顶级包(如argparse)不能完全修补 - 大概是因为没有补丁的参考。一种解决方案是将每个单独的调用修补到包中(比如argparse.ArgumentParser)。理论上,如果添加对包的调用时没有相应的补丁,那么在单元测试期间会导致意外调用导入。蟒蛇模拟补丁顶级包

虽然解决方法并不是那么不方便,但它完全适用于像argparse这样的补丁包。 mock_open似乎使用__main__.open修补内置open()一些诡计。这是如何工作的,并且可以使用类似的恶作剧来修补顶层包?

回答

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()的模块。