Модуль запуска тестового модуля .NET выдает FaultException.Detail - PullRequest
2 голосов
/ 12 января 2011

Я запускаю несколько модульных тестов для службы WCF.Служба настроена на включение сведений об исключении в ответ на ошибку (со следующим в моем файле конфигурации службы).

<serviceDebug includeExceptionDetailInFaults="true" />

Если тест вызывает необработанное исключение на сервере, ошибка принимается клиентом сполностью заполненная трассировка стека сервера.Я могу увидеть это, вызвав метод ToString() исключения.Проблема в том, что это, похоже, не выводится ни одним из бегунов, которые я пробовал (xUnit, Gallio, MSTest).Похоже, они просто выводят сообщение и свойства StackTrace исключения.

Чтобы проиллюстрировать, что я имею в виду, следующий модульный тест выведет три раздела:

  • Сообщение об ошибке
  • Трассировка стека ошибок
  • Стандартный вывод на консоль (содержит информацию, которую я хотел бы получить, например, "Подробная информация о сбое равна ExceptionDetail, вероятно, создана IncludeExceptionDetailInFaults = true, чье значение: ..."

public void Test()
{
    try
    {
        service.CallMethodWhichCausesException();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex); // this outputs the information I would like
       throw;
    }
}

Редактировать: Однако я бы предпочел, чтобы меня не заставляли ловить исключение в каждом тестеи запишите его в консоль, чтобы выяснить содержимое в свойстве FaultException объекта Detail.

Например,

public void Test()
{
    service.CallMethodWhichCausesException();
}

Имея эту информациюсделает начальную фазу тестирования и развертывания намного менее болезненной.

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

Кто-нибудь знает, есть ли способ включить эту информацию всякий раз, когда необработано возникла исключительная ситуация?Есть ли параметр, который мне не хватает?В моей сервисной конфигурации отсутствует надлежащая обработка ошибок?Возможно, я мог бы написать какой-нибудь плагин / адаптер для какой-то платформы модульного тестирования?Возможно, есть другая среда модульного тестирования, которую я должен использовать вместо этого!

Моя настоящая установка - это модульные тесты xUnit, выполняемые через Gallio для среды разработки, но у меня есть отдельный набор «тестов дыма»который я хотел бы, чтобы наши инженеры запускали через тестовый интерфейс xUnit GUI (или Gallio или что-то еще) для упрощения окончательного развертывания.

Спасибо.

Адам

Ответы [ 3 ]

1 голос
/ 12 января 2011

Я думаю, что нашел решение. Олег Сыч реализовал поведение WCF, которое прозрачно собирает исключения от сервера к клиенту, вызывая их на клиенте, как если бы они произошли там.

Это так же просто, как добавить атрибут поведения службы в контракт на обслуживание (интерфейс).

Этот подход особенно полезен, если решено, что существующий код, написанный для выполнения внутри одного процесса, должен распространяться через службы WCF. Это означает, что этого можно достичь, не требуя каких-либо изменений в обработке исключений клиента (например, вы все равно можете обрабатывать SecurityException на клиенте вместо того, чтобы обрабатывать FaultException<SecurityException> при переходе к более распределенному дизайну).

Пост можно найти здесь: http://www.olegsych.com/2008/07/simplifying-wcf-using-exceptions-as-faults/

Поскольку мои службы WCF используют смесь ws2007HttpBinding и basicHttpBinding (для совместимости), мне пришлось внести несколько изменений в код (как упоминалось в комментариях к посту выше). В частности:

В ExceptionMarshallingMessageInspector.AfterReceiveReply:

Exception exception = faultDetail as Exception;
if (exception != null)
{
    // NB: Error checking etc. excluded
    // Get the _remoteStackTraceString of the Exception class

    FieldInfo remoteStackTraceString = typeof(Exception).GetField(
        "_remoteStackTraceString",
        BindingFlags.Instance | BindingFlags.NonPublic);

    // Set the InnerException._remoteStackTraceString to the current InnerException.StackTrace
    remoteStackTraceString.SetValue(
        exception,
        exception.StackTrace + Environment.NewLine);

    throw exception;
}

... и в ExceptionMarshallingMessageInspector.ReadFaultDetail я внес изменение, чтобы он искал узел подробностей с локальным именем, равным либо "Detail" (для ws2007HttpBinding ", либо" detail "(для basicHttpBinding).

Надеюсь, это поможет.

Адам

0 голосов
/ 12 января 2011

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

Например, в разделе Подробности отчета HTML разверните дерево тестов и найдите метод тестирования.

Console output in Gallio test report

0 голосов
/ 12 января 2011

Вывод на консоль доступен в виде столбца в окне «Результаты теста».

...