如何对与Git交互的类进行单元测试?

时间:2013-10-12 16:15:57

标签: c# git unit-testing

我正在编写一个从Git存储库中提取信息的程序。我正在研究一个名为GitLog的类,它提取提交日志。基本上,它会旋转一个进程来运行'git log'命令,并将stdout上返回的内容捕获到流读取器中。方法的要点是这个(我们可以假设GitWorkingCopyPath有效并指向Git工作副本,其余代码完全未经测试,这是问题的真正意义):

public StreamReader GetLogStream()
    {
    var psi = new ProcessStartInfo("git.exe", "log");
    psi.CreateNoWindow = true;
    psi.RedirectStandardError = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.WorkingDirectory = GitWorkingCopyPath;
    var process = Process.Start(psi);
    return process.StandardOutput;
    }

显然,这与在磁盘上某处有工作副本非常相关。我正在考虑如何对这种方法进行单元测试,而不必放置一个Git存储库,或者是否可能。

也许我对这些细节很着迷,这不是单元可测试的。提升一级抽象,很容易看出我如何模拟整个GitLog类并返回一些预制结果。所以我想在这里深入研究太多细节吗?你会怎么做到这一点?

1 个答案:

答案 0 :(得分:1)

首先重构该方法,使其对单元测试友好:

public StreamReader GetLogStream(ProcessStartInfo psi)
{
    ...

然后普通代码通过GetLogStream(new ProcessStartInfo("git.exe", "log")) ...

调用该方法

并且您的单元测试代码传入一个模拟git的虚拟脚本。