Модульное тестирование лучше всего проводить на общедоступном интерфейсе ваших классов.Итак, я бы посоветовал вам сделать это общедоступным или попробовать косвенно (через публичные методы, которые вы выставляете).
Что касается "Можно ли создать модульные тесты для чего-то подобного?", это зависит от того, насколько чистым вы хотите быть по концепции юнит-тестов, насколько зависимым от пользователя вы хотите, чтобы они были, и что именно делает //show a custom message
.
Насколько чистыми вы хотите, чтобы ваши юнит-тестыбыть?Если вам все равно, являются ли они грязными хакерами, то вы можете использовать отражения, чтобы предоставить приватный метод для своих модульных тестов, и просто вызвать его напрямую.Это, в общем-то, плохая практика, потому что ваши частные функции по определению могут быть изменены.В противном случае вы просто сделаете их общедоступными.
Если //show a custom message
выводит на консоль, то вы можете довольно легко выполнять тесты, выполняемые без вывода сообщений.Если вы действительно хотите проверить вывод, вам нужно подключиться к вашему Console.Out
, чтобы вы могли увидеть, что было напечатано, и добавить соответствующие утверждения.
Если //show a custom message
использует MessageBox.Show
, тогдавам, возможно, придется сделать автоматизированный тест пользовательского интерфейса, чтобы иметь возможность проверить это.Ваши тесты не будут работать в фоновом режиме и будут прерываться, если вы будете двигать мышью во время выполнения теста.
Если вы не хотите выполнять автоматический тест пользовательского интерфейса просто для тестированиялогика этого класса, лучший из известных мне способов, - это модифицировать ваш класс, чтобы использовать внедрение зависимостей.Инкапсулируйте весь фактический выходной код (MessageBox.Show
) в другой класс, абстрагируйте его с помощью интерфейса или абстрактного базового класса и сделайте так, чтобы ваш исходный класс ссылался на абстрактный тип.Таким образом, вы можете внедрить макет в свои тесты, и он не будет выводиться на экран.
public interface INotification
{
void ShowMessage(string message);
}
public class MessageBoxNotification : INotification
{
public void ShowMessage(string message)
{
MessageBox.Show(message);
}
}
public class MyClass
{
private INotification notification;
public MyClass(INotification notification)
{
this.notification = notification;
}
public void SomeFunction(int someValue)
{
// Replace with whatever your actual code is...
ToDate toDate = new SomeOtherClass().SomeOtherFunction(someValue);
CheckToDate(toDate);
}
private void CheckToDate(DateTime ToDate)
{
if (Manager.MaxToDate < ToDate.Year)
notification.Show("toDate, too late!: " + toDate.ToString());
}
}
Ваш модульный тест создаст свой собственный класс INotification
, передав его конструкторуMyClass
и вызовите метод SomeFunction
.
Возможно, вы захотите абстрагировать такие вещи, как Manager
, и классы будут включать в вычисления ToDate
аналогичным образом.