我正在尝试开始使用 unittest.mock的 Action /断言模式而不是 mox的记录/重播/验证模式。
# foo.py
def op_1(param):
pass
def op_2(param):
pass
def do_stuff(param_1, param_2):
global config
global log
try:
op_1(param_1)
if config.getboolean('section','option'):
op_2(param_2)
except:
log.error("an error occured")
并且,这是我的单元测试文件的示例。
# test_foo.py
class TestFoo(unittest.TestCase):
def test_do_stuff(self):
param_1 = None
param_2 = None
foo.config = MagicMock()
foo.config.getboolean('section','option', return_value = True)
foo.op_1 = MagicMock()
foo.op_2 = MagicMock()
do_stuff(param_1, param_2)
foo.op_1.assert_called_once_with(param_1)
foo.op_2.assert_called_once_with(param_2)
foo.config.getboolean.assert_called_once_with('section','option')
此测试是否验证以下项目/我是否正确使用模拟?
- do_stuff 调用无误返回
- 用 param_1 调用了 op_1
- 用 param_2 调用了 op_2
- 配置解析器对象已被使用,但具体调用无关紧要
最佳答案
原来我用错了return_value
。
当我需要一个mock.Mock
或mock.MagicMock
对象来返回一个值时,无论传递的参数如何,它都需要始终返回该值。不过,根据传递的参数(可能的功能请求)提供不同的行为可能会很好。
我完成这个的方式是:
foo.config.getboolean = mock.MagicMock(return_value = True)
然后我可以这样做:
self.assertGreaterThan(len(foo.config.mock_calls), 0)
self.assertGreaterThan(len(foo.config.getboolean(str(),str())), 0)
关于python - 如何使用 unittest.mock 在单元测试中模拟任意 ConfigParser 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997571/