嘲笑GitPython Repo调用

rta7y2nd  于 2023-05-19  发布在  Python
关注(0)|答案(1)|浏览(160)

我有一个类,它有一个函数,可以在git仓库中添加未暂存的更改并提交它们

def commit_local_changes(self, repo_path):
        repo = Repo(repo_path)
        changed_files = repo.git.diff(None, name_only=True).splitlines()
        if changed_files:
            for file in changed_files:
                repo.git.add(file)
            repo.git.commit("-m", "some commit message")
        return repo.head.object.hexsha

我正在尝试编写单元测试来检查这个功能,我希望repo.git.diff(None, name_only=True)实际上返回除了mock之外的东西。我试着这样设置测试:

@patch("myModule.Repo")
def test_commit_local_changes(self, mock_repo):
       mock_repo.return_value
            .git.return_value
            .diff.return_value = 'file1\nfile2'

但是当我在main方法中打印changed_files并调用mock时,我看到它只是一些MagicMock:

<MagicMock name='Repo().git.diff().splitlines()' id='140551053340304'>
gopyfrb3

gopyfrb31#

我的问题是对Python的属性mocking和函数结果的返回值缺乏理解。
在我的例子中,Repo()是一个创建类Repo示例的函数(python可能有不同的名称,我更熟悉Java)。所以我需要模拟Repo()的返回值,然后Python会为我模拟它的属性,然后我需要模拟diff()调用的返回值。以下方法起作用:

mock_repo.return_value.git.diff.return_value = "file1\nfile2"

相关问题