如何对与 Git 交互的类进行单元测试
本文关键字:单元测试 交互 Git | 更新日期: 2023-09-27 18:35:09
我正在编写一个从 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 类并只返回一些预制结果。那么我是否试图在这里深入了解太多细节?你会如何处理这个问题?
首先重构方法,使其对单元测试友好:
public StreamReader GetLogStream(ProcessStartInfo psi)
{
...
然后普通代码通过GetLogStream(new ProcessStartInfo("git.exe", "log")) ...
调用该方法
你的单元测试代码在一个模拟 Git 的虚拟脚本中传递。