4

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

尽管解决方法并不是那么不方便,但最好直接修补 argparse 之类的软件包。mock_open似乎使用了一些恶作剧来修补内置open()using __main__.open. 这是如何工作的,是否可以使用类似的恶作剧来修补顶级软件包?

4

1 回答 1

4
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()

于 2014-04-03T13:04:02.360 回答