Предполагая, что вы знакомы с модульным тестированием, и, если вы понимаете, что это странный "красный процесс рефакторинга" (так как вы сказали, что знакомы с TDD), я быстро объясню типичный мысленный процесс.
Ваша жизнь в TDD станет намного проще, если вы подумаете о конкретной единице проблемы, а все остальные связанные вещи следует рассматривать с точки зрения зависимостей. вот образец
Сценарий: -
Я хочу, чтобы моя программа отображала hello world на консоли.
тдд мыслительный процесс: -
«Я думаю, что моя программа запустится, затем вызовите консольную программу, передав ей мое сообщение, а затем я ожидаю, что моя консольная программа отобразит его на экране»
"поэтому мне нужно проверить, что при запуске моей программы она должна вызывать консольную программу"
"теперь, каковы зависимости? Хм, я знаю, что консольная программа - одна из них. Мне не нужно беспокоиться о том, как консоль выведет сообщение на экран (вызов устройства io, печать и все такое Мне просто нужно знать, что моя программа успешно называется консольной программой. Мне нужно верить, что консольная программа работает, и если она не работает, то в данный момент я не несу ответственности за тестирование и проверку того, что она работает. хочу проверить, что моя программа при запуске вызывает консольную программу. "
"но я даже не знаю точно, какую консольную программу вызывать. Я знаю System.console.Writeline (конкретная реализация), но в будущем это может измениться из-за изменения требований, так что мне делать? «
«Ну, я буду зависеть от интерфейса (или абстракции), а не от конкретной реализации, тогда я могу создать поддельную консоль, реализующую интерфейс, с которым я могу протестировать» *
public interface Iconsole
{
void WriteToConsole(string msg);
}
public class FakeConsole : Iconsole
{
public bool IsCalled = false;
public void WriteToConsole(string msg)
{
IsCalled = true;
}
}
Я поместил члена IsCalled, чье «состояние» изменится, если консольная программа будет вызываться
Хорошо, я знаю, это звучит как долгий мыслительный процесс, но это окупается. Тдд заставляет вас думать, прежде чем кодировать, что лучше, чем кодировать, прежде чем думать
В конце дня вы можете найти что-то вроде следующего для вызова вашей программы:
var console = new FakeConsole();
console.IsCalled = false;
my_program program = new my_program(console);
program.greet();
Я передал консоль my_program, чтобы my_program использовал консоль для записи нашего сообщения на экран.
и моя my_program может выглядеть так:
public class my_program
{
Iconsole _consol;
public my_program(Iconsole consol)
{
if (consol != null)
_consol = consol;
}
public void greet()
{
_consol.WriteToConsole("Hello world");
}
}
итоговый юнит-тест будет: -
[TestMethod]
public void myProgramShouldDisplayHelloWorldToTheConsole()
{
//arrange
var console = new FakeConsole();
console.IsCalled = false;
my_program program = new my_program(console);
//act
program.greet();
//assert
Assert.AreEqual(true, console.IsCalled, " console was not called to display the greeting");
}