0

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 リポジトリを配置することなく、このメソッドを単体テストする方法、またはそれが可能かどうかを考えようとしています。

おそらく私は詳細にこだわっていて、これは単体テストできません。抽象化の 1 レベル上に移動すると、GitLog クラス全体をモックアウトして、定型の結果を返す方法を簡単に確認できます。では、ここで詳しく掘り下げすぎているのでしょうか。これにどのようにアプローチしますか?

4

1 に答える 1

1

メソッドを単体テストしやすいようにリファクタリングすることから始めます。

public StreamReader GetLogStream(ProcessStartInfo psi)
{
    ...

次に、通常のコードはメソッドを呼び出しますGetLogStream(new ProcessStartInfo("git.exe", "log")) ...

単体テスト コードは、git をモックするダミー スクリプトを渡します。

于 2013-10-12T16:27:15.710 に答える