Модульное тестирование форм и событий в C#

Я хочу написать контрольные примеры для кода C#, который запускает события или отображает форму для ввода пользователем, например:

private void CreateRecord_Click(object sender, EventArgs e)
{
    try
    {
        this.InitiateRecording();
    }
    catch (BubbleUiException ex)
    {
        objLog.Error(TextRes.IDC_EShuttleError, ex);
        MessageBox.Show(
            ex.Message,
            TextRes.IDC_EShuttleError,
            MessageBoxButtons.OK,
            MessageBoxIcon.Error);
     }
     catch (Exception ex)
     {
         objLog.Error("Error occurred", ex);
         MessageBox.Show(
             ex.Message,
             TextRes.IDC_Error,
             MessageBoxButtons.OK,
             MessageBoxIcon.Error);
     }
 }

Как написать модульные тесты для такого рода кода, используя Mbunit?

2 ответа

Решение

Тестовое задание:

  1. this.InitiateRecording() называется
  2. Force a BubbleUiException когда this.InitiateRecording() называется
  3. Force a Exception это не BubbleUiException когда this.InitiateRecording() называется
  4. Заворачивать MessageBox.Show so you can test that it prints what you expect when the exceptions are thrown.
  5. Тестовое задание objLog.Error называется.

You can assume that your click event works (that the method is called when the control is clicked) as Microsoft have already tested this.

"Чистый" ответ заключается в том, что, поскольку это частный метод, он не должен подвергаться модульному тестированию, поскольку это деталь реализации. Вы должны стремиться тестировать только публичные API.

Поскольку это обработчик событий, вы можете захотеть проверить его по разным причинам. Как написано в настоящее время, это будет трудно сделать. Тот факт, что у вас есть

this.InitiateRecording();

линия предполагает, что вы не реализовали должным образом разделение интересов. Ваш класс для обработки событий также, кажется, содержит код для обработки записи. Во-вторых, у вас есть жестко закодированные вызовы MessageBox.Show, что усложнит тестирование, так как ваши тесты не могут выполняться автоматически, автономно.

Поэтому я бы порекомендовал:

  1. Реорганизовать функциональность записи в отдельный класс, который может быть протестирован модулем.
  2. Вставьте метод MessageBox.Show в этот класс, чтобы его можно было заглушить во время тестирования.
  3. Не проверяйте CreateRecord_Click(), так как он просто вызовет метод в вашем новом классе.
Другие вопросы по тегам