Модульное тестирование WCF Faults - PullRequest
9 голосов
/ 01 ноября 2010

Каков наилучший способ для модульного тестирования ожидаемых отказов от служб WCF?

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

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

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

Вот пример кода того, как в настоящее время выглядит реализация ...

В проекте модульного теста есть ссылка на службу для моей службы WCF, и я определил интерфейс следующим образом:

[OperationContract(Name = "DoSomething")]
[FaultContract(typeof(EpicFail))]
ResponseObject DoSomething(RequestObject requestObject);

Ошибка определяется следующим образом:

[DataContract]
public class EpicFail
{

    public EpicFail(string action)
    {
        this.Reason = "Epic Fail";
        this.Action = action;
    }

    [DataMember]
    public string Reason
    {
        get;
        set;
    }

    [DataMember]
    public string Action
    {
        get;
        set;
    }

}

Код, который вызывает службу, выглядит примерно так:

[TestMethod()]
[ExpectedException(typeof(FaultException<EpicFail>))]
public void FaultTest_Fails_Epicly()
{
    bool testPassed = false;

    try
    {
        ResponseObject resp = GetServiceClient().DoSomething(req);
    }
    catch (FaultException<EpicFail>)
    {
        testPassed = true;
    }

    Assert.IsTrue(testPassed);
}
  • Я отредактировал код, чтобы показать, что я использую атрибут ExpectedException, и, похоже, он не оказывает большого влияния на предотвращение взлома IDE / Debugger при возникновении исключения в службе.

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

mattv,

Почему этот тест должен получить доступ к услуге удаленно ?Из того, что я вижу, ваш код:

ResponseObject resp = GetServiceClient().DoSomething(req);

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

Однако, если вам нужен в этом сценарии, вы пытались НЕ УСТАНОВИТЬ исключение и запустить тест?Дает ли он тот же результат?

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

try {
   //Do something
}
catch(SomeException e) {
   //Do something with e
   throw
}
1 голос
/ 01 ноября 2010

Вы всегда можете использовать ExpectedExceptionAttribute (в NUnit), чтобы убедиться, что это выброшенное исключение. MSTest также имеет аналогичную концепцию.

[ExpectedException(typeof(MyException))]
void my_test()
{
     // test
}

Если у вас есть какая-то проверка Mock, я бы использовал блок try / catch и верифицировал в catch, а затем выбрасывал исключение.

UPDATE

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

Если вам нужно проверить специальную информацию в исключении, вы перехватываете исключение, проверяете информацию и затем перебрасываете:

[ExpectedException(typeof(MyException))]
void my_test()
{
     try
     {
         // call the service
     }
     catch(MyException ex)
     {
          Assert.IsTrue(ex.Message.Contains("error code 200"));
          throw ex;
     }

}
...