python - 如何使用 unittest.mock 在单元测试中模拟任意 ConfigParser 调用

标签 python unit-testing mocking python-3.3

我正在尝试开始使用 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')

此测试是否验证以下项目/我是否正确使用模拟?

  1. do_stuff 调用无误返回
  2. 用 param_1 调用了 op_1
  3. 用 param_2 调用了 op_2
  4. 配置解析器对象已被使用,但具体调用无关紧要

最佳答案

原来我用错了return_value

当我需要一个mock.Mockmock.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/

相关文章:

c# - 如何使用 Moq 在 ASP.NET MVC 中模拟 HttpContext?

python - 如何使用 numpy 将 RGB 图像转换为基于颜色的单热编码 3d 数组?

python - Django传输上传的文件

python - 通过索引将 numpy 数组中的值设置为 NaN

java - @ContextConfiguration 与 "locations"或相同配置与 "classes"和 @ImportResource 之间的区别

C++ 返回一个 future

python - 'int' 列的 .apply() 方法出现问题

java - JDBC/数据库单元测试的最佳实践

python - 如何编写从 zip 文件创建 InMemoryUploadedFile 的 python 测试?

c# - it.isAny 和 it.is 在单元模拟测试中是什么