Модульный тест перерыв / подтверждение блокировки службы WCF? - PullRequest
1 голос
/ 31 августа 2010

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

Например, яв тестовом методе 3 звонка от моего сервисного клиента к сервису WCF - Call1, Call2 и Call3.В первый раз Call1 работает отлично, Call2 работает отлично, а затем Call3 запускает Assert, потому что некоторые данные неверны.В следующий раз при выполнении теста Call1 завершится с ошибкой:

"Исключение типа 'System.ServiceModel.CommunicationException' произошло в mscorlib.dll, но не было обработано в коде пользователя

Дополнительная информация: Произошла ошибка при получении ответа HTTP на http://localhost/Kiosk/KioskSite.svc. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с прерыванием контекста HTTP-запроса сервером (возможно, из-за остановки службы. См. подробности в журналах сервера. "

После выполнения iisreset все снова в порядке.

У кого-нибудь есть идеи, что может происходить?

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Если вам нужно перезапустить IIS, похоже, у вас есть проблемы с управлением состоянием в вашем сервисе. Ваш тест прошел успешно, поскольку он выявил эту проблему - клиент с плохим поведением может заморозить службу.

Я могу предложить три вещи, которые стоит попробовать в вашем расследовании:

1) Создайте консольный хост для вашей службы и посмотрите, не возникнут ли проблемы. Это определит, является ли это проблемой IIS.

2) Измените режим параллелизма в вашем сервисе, используя поведение сервиса.

   [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
   class MyServiceImplementation : IMyService
   {
      // ...
   }

3) Убедитесь, что вы вызываете Close для всех созданных вами прокси, даже если тест не пройден. Служба может иметь только ограниченное количество прокси, подключенных к ней одновременно. (По умолчанию 10)

[Test]
void ATestMethod()
{
     MyService proxyInstance = new MyService();
     try
     {
           Assert.IsTrue(proxyInstance.MethodC());
     }
     finally
     {
          proxyInstance.Close();
     }
}
0 голосов
/ 31 августа 2010

Это не похоже на юнит-тесты. Модульные тесты выделяют фрагменты кода и тестируют их индивидуально, похоже, вы пишете интеграционные тесты.

Почему вы вообще тестируете вызов WCF, не можете ли вы протестировать серверный метод изолированно, не беспокоясь о WCF?

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