2013-10-12 3 views
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, или даже это возможно.

Возможно, я одержим деталями, и это невозможно проверить. Перемещаясь на один уровень абстракции, довольно легко увидеть, как я могу издеваться над всем классом GitLog и просто возвращать некоторые законченные результаты. Так я пытаюсь подробно рассказать об этом здесь? Как бы вы к этому подошли?

+1

Возможно, вы захотите посмотреть на libgit2 - http://libgit2.github.com/ – Lee

+0

@lee Это отличное предложение (+1), однако для одной команды мне нужно (git log), я думаю, что это проще просто для использования git.exe. Возможно, это не самое чистое решение, но libgit2 представляет некоторые аспекты лицензирования, с которыми я не хочу иметь дело, и похоже, что это будет больше работать только для одной команды, в которой я нуждаюсь. –

ответ

1

Start рефакторинга метод, чтобы сделать это блок-тест дружественный:

public StreamReader GetLogStream(ProcessStartInfo psi) 
{ 
    ... 

Тогда нормальный код вызывает метод через GetLogStream(new ProcessStartInfo("git.exe", "log")) ...

и ваш блок кода тест проходит в фиктивный сценарий, который издевается мерзавец.

+0

Это неплохая идея ... Я отдам это. Спасибо. –

+0

Я принимаю это как свой ответ сейчас, когда у меня это работает. Спасибо за эту идею. Это было не гладкое путешествие, хотя у меня были всевозможные проблемы с его работой, включая Visual Studio 2012, сохраняя мой .vbs-файл в кодировке, которую компилятор VBScript не мог понять! У меня возникло время, чтобы понять, почему мой сценарий не работает. Я не * люблю * идею нереста процессов в своих модульных тестах, но он действительно выполняет свою работу, и я думаю, что я буду придерживаться этого. –

+0

«Мне не нравится идея процессов нереста в моих модульных тестах, но она выполняет свою работу, и я думаю, что я буду придерживаться ее». Это тоже мой взгляд. Если это возможно, я избегаю этого, но иногда это единственный способ проверить код. Рад, что идея была полезной для вас. –

Смежные вопросы