Я думаю, что ваш подход с интерфейсом будет работать, и я не думаю, что использовал бы события.Предполагая, что приложение не принимает пользовательский ввод, кроме параметров командной строки, я бы, вероятно, использовал что-то вроде этого, чтобы обернуть Console.Write/Console.WriteLine
:
public interface IConsoleWriter
{
void Write(string format, params object[] args);
void WriteLine(string format, params object[] args);
}
Чтобы проверить, я бы либо создал TestConsoleWriter
, который будетвсе записи в буфер, против которых я мог бы потом утверждать, или я создал бы макет и проверил, что Write
или WriteLine
был вызван с параметрами, которые я ожидал.Если ваше приложение будет выполнять тонну записи на консоль (скажем, +100 МБ или около того вывода), тогда использование mock, вероятно, будет предпочтительнее по соображениям производительности, но в противном случае я бы сказал, выберите любой метод, который, по вашему мнению, будетс ним проще работать.
Однако этот подход имеет несколько ограничений.Если вы используете какие-либо сборки, которые вы не можете изменить, и они пишут в консоль, вы не увидите этот вывод, поскольку не можете заставить эти классы использовать ваш IConsoleWriter
.Другая проблема заключается в том, что методы Write
и WriteLine
имеют примерно 18 перегрузок, поэтому вы можете использовать множество методов.Чтобы обойти эти ограничения, вы можете просто использовать метод Console.SetOut
для перенаправления вывода консоли на ваш собственный TextWriter
во время тестирования.
Лично я думаю, что я бы выбрал подход SetOut
.Это была бы только одна строка, которую вы должны добавить в начале ваших модульных тестов (или, возможно, в методе SetUp
), и вы можете просто утверждать, что записано в TextWriter
.