为了账号安全,请及时绑定邮箱和手机立即绑定

从__getattr__方法检索的模拟函数

从__getattr__方法检索的模拟函数

慕尼黑8549860 2021-03-29 13:11:13
我正在自动化一些存储库操作,并且正在使用GitPython来完成这项工作。让我们简化事情并假设我想断言我的函数是否pull在存储库上调用了method。代码如下:from pytest_mock import MockFixturefrom git import Git, Reporepo = Repo('/Users/Jatimir/path/to/repo')def pull() -> None:    repo.git.pull()但是,我注意到Git该类有些特殊,没有实现pull。相反,它将“委派”所有__getattr__使用另一种方法完成工作的流量。def __getattr__(self, name):    ...    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)我的问题是如何进行测试?我正在使用pytest和提供测试装置的pytest-mock,mocker这是我的尝试:def test_pull1(mocker: MockFixture) -> None:    pull_mock = mocker.MagicMock(name='pull')    getattr_mock = mocker.MagicMock(name='__getattr__', return_value=pull_mock)    mocker.patch.object(Git, '__getattr__', getattr_mock)    pull()    pull_mock.assert_called_once_with()def test_pull2(mocker: MockFixture) -> None:    pull_mock = mocker.Mock(name='pull')    def __getattr__(self, name):        if name == 'pull':            return pull_mock    mocker.patch.object(Git, '__getattr__', __getattr__)    pull()    pull_mock.assert_called_once_with()它们都可以工作,但是我觉得有更好的方法,也许我测试这种方法是错误的。
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

使用create参数,我设法通过以下代码实现了我想要的:


def test_pull(mocker: MockFixture) -> None:

    m = mocker.patch.object(Git, 'pull', create=True)

    pull()

    m.assert_called_once_with()

摘录的文档解释了什么create=True:


默认情况下,patch()将无法替换不存在的属性。如果您传入create = True,并且该属性不存在,则在调用已修补的函数时,patch将为您创建该属性,然后再将其删除。


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信