Модульное тестирование WCF Faults

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

Я пытаюсь выполнить модульное тестирование службы WCF, которая (правильно) выбрасывает FaultExceptions для определенной воспроизводимой ошибки. Модульные тесты получают экземпляр клиента 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 ответа

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

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

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

ОБНОВИТЬ

Когда вы используете 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;
     }

}

mattv,

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

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

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

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

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

try {
   //Do something
}
catch(SomeException e) {
   //Do something with e
   throw
}
Другие вопросы по тегам