为调用子流程以运行git命令的函数编写单元测试

时间:2019-06-27 12:41:26

标签: python git subprocess python-unittest

我编写了一个函数,该函数可在调用时打开编辑器以编辑提交消息。看起来像这样:

def apply():
    return subprocess.run(['git', 'commit', '-o', '--amend'])

此函数在另一个函数中被调用,我正在尝试为该函数编写单元测试。问题在于,该函数在调用时会打开编辑器。

因此,我想到了将提交消息作为在单元测试中被调用的子流程的输入。

def apply(msg=None):
    if msg is None
        return subprocess.run(['git', 'commit', '-o', '--amend'])
    else:
        return subprocess.run(['git', 'commit', '-o', '--amend'], input=msg)

但这给出了以下错误

 Too many errors from stdintor to close the file... 
 Buffer written to /home/projects/xrides/.git/COMMIT_EDITMSG.save.7
 error: There was a problem with the editor 'editor'.

1 个答案:

答案 0 :(得分:0)

您的依赖项注入方法很好,您只需要在-m命令行中添加--message / git参数并传递消息即可(不像您那样通过STDIN) :

subprocess.run(['git', 'commit', '-o', '--amend', '--message', msg])

所以:

def apply(msg=None):
    if msg is None
        return subprocess.run(['git', 'commit', '-o', '--amend'])
    else:
        return subprocess.run(['git', 'commit', '-o', '--amend', '--message', msg])

另一种方法是模拟测试中的subprocess.run对象,以便它返回一个可以检查或进一步验证的自定义值。