Модульное тестирование: жесткая зависимость MessageBox.Show()
Какими способами можно тестировать модуль SampleConfirmationDialog? SampleConfirmationDialog будет выполняться с помощью приемочных тестов, однако, как мы можем выполнить его модульное тестирование, поскольку MessageBox не является абстрактным и не соответствует интерфейсу?
public interface IConfirmationDialog
{
/// <summary>
/// Confirms the dialog with the user
/// </summary>
/// <returns>True if confirmed, false if not, null if cancelled</returns>
bool? Confirm();
}
/// <summary>
/// Implementation of a confirmation dialog
/// </summary>
public class SampleConfirmationDialog : IConfirmationDialog
{
/// <summary>
/// Confirms the dialog with the user
/// </summary>
/// <returns>True if confirmed, false if not, null if cancelled</returns>
public bool? Confirm()
{
return MessageBox.Show("do operation x?", "title", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes;
}
}
3 ответа
Вы не можете, это невозможно проверить в текущем состоянии. Для этого конкретного класса также нет никакого смысла в его модульном тестировании... это всего лишь легкая оболочка вокруг встроенной функции фреймворка, поэтому все, что вам нужно сделать, это протестировать фреймворк.
Если вам абсолютно необходимо его протестировать, интерфейс IConfirmationDialog должен иметь другую зависимость, которую вы можете смоделировать в модульном тесте.
Вы должны взглянуть на Typemock, коммерческий фреймворк, который позволяет вам тестировать подобные ситуации модульными библиотеками.NET. Смотрите их сайт для получения дополнительной информации.
Я думаю, что можно прекратить тестирование на этом уровне. Ваше взаимодействие с IConfirmationDialog
важнее проверки того, что MessageBox.Show
на самом деле вызывается. Так как это интерфейс, который легко поддается издевательству, я думаю, вы достаточно хорошо охвачены.