Модульное тестирование содержимого сообщения об ошибке? - PullRequest
2 голосов
/ 27 марта 2012

У меня есть класс, который вызывает событие с сообщением об ошибке.

В некоторых моих тестах я подписываюсь на событие и утверждаю, что сообщение об ошибке не пустое.

[Test]
public MyMethod_DoBad_ErrorMessageNotEmpty()
{
    var logic = new MyClass();

    string ErrorMessage = String.Empty;

    logic.DisplayError += delegate(string s)
    {
         ErrorMessage = s;
    };

    logic.DoItBadly();

    Assert.IsFalse(String.IsNullOrWhiteSpace(ErrorMessage));

}

//MyClass

public void DoItBadly()
{
  //do something naughty but not final
  DisplayError("Naughty");

  //some other problem arises
  if (1==1)
    DisplayError("Something else naughty");
}

Тем не менее, я начинаю обнаруживать, что мои новые тесты, которые должны провалиться, проходят тестирование на граничном уровне, потому что оно вызвало событие ошибки в коде, прежде чем оно добралось до того места, куда я хочу.

Поэтому я должен утверждать, что сообщение об ошибке содержит указанную строку?

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

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

Это говорит о том, что вы либо повторно используете существующий объект между тестами, либо что ваш тест делает слишком много.Если вы не можете помочь, но выполняете работу до операции real , которую хотите протестировать, вы можете написать свой тест следующим образом:

// Construct objects
// Do setup work
// Check that there's no error message yet

// Do work you expect to fail
// Check that there *is* an error message

Конечно, вы можете проверьте точное сообщение об ошибке, но это может занять много времени.Если вы используете разумные специальные отчеты об ошибках (не беспокоитесь о i18n и т. Д.), То я лично проверю, присутствует ли сообщение об ошибке или нет.

0 голосов
/ 27 марта 2012

Я думаю, вы должны проверить оба этих случая в разных тестах:

[Test]
public ShouldRaiseNaughtyErrorWhenDoBadly()
{
    var logic = new MyClass();
    string errorMessage = String.Empty;
    logic.DisplayError += delegate(string s) {errorMessage = s; };

    logic.DoItBadly();

    Assert.That(errorMessage, Is.EqualTo("Naughty"));
}

[Test]
public ShouldRaiseElseNaughtyErrorWhenDoBadlyWithOtherProblem()
{
    var logic = new MyClass();
    string errorMessage = String.Empty;
    logic.DisplayError += delegate(string s) {errorMessage = s; };

    // do something for other problem condition
    logic.DoItBadly();

    Assert.That(errorMessage, Is.EqualTo("Something else naughty"));
}

Или, если вам нужно проверить обе ошибки, если они возникли:

[Test]
public ShouldRaiseBothErrors()
{
    var logic = new MyClass();
    List<string> errorMessages = new List<string>();
    logic.DisplayError += delegate(string s) {errorMessages.Add(s); };

    // do something for other problem condition
    logic.DoItBadly();

    Assert.That(errorMessages.Count, Is.EqualTo(2));
    Assert.That(errorMessages[0], Is.EqualTo("Naughty"));
    Assert.That(errorMessages[1], Is.EqualTo("Something else naughty"));
}

UPDATE: Учитывая характер ваших уведомлений на основе событий, вы можете перехватить их все, а затем найти конкретную ошибку:

[Test]
public ShouldRaiseNaughtyErrorWhenDoBadly()
{
    var logic = new MyClass();
    List<string> errorMessages = new List<string>();
    logic.DisplayError += delegate(string s) { errorMessages.Add(s); };    

    logic.DoItBadly();

    Assert.That(errorMessages.Contains("Naughty"));
}
0 голосов
/ 27 марта 2012

В идеале вы хотели бы изолировать и абстрагировать области DoItBadly (), которые загрязняют ваш текст ошибки сообщением об ошибке, чтобы можно было без проблем протестировать остальную часть метода.

Однако,учитывая понимание того, что это часто легче сказать, чем сделать, следующим лучшим вариантом будет заполнение ErrorMessage только с s, если выполняется определенное условие (или наличие белого списка сообщений об ошибках, которые не заполняют ErrorMessage).Поэтому, если вы устанавливаете ErrorMessage, только если это не ошибка, которую вы считаете «приемлемой», тогда ваш тест должен пройти и ваше собственное требование должно быть выполнено.

Хотя еще лучше утверждать положительный результат, вместодовести до вашего успеха отсутствие отрицательных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...