Я думаю, что лучший подход - это отдельно проверить все проблемы; тестирование соединения, клиентская библиотека (прокси) и вызовы сервисных методов. Насмешка и внедрение зависимостей - это хороший способ независимой проверки подключения и поведения сервиса, но я сомневаюсь, что он сможет обойти тестирование конечных точек, зависящее от промежуточного программного обеспечения.
Вы можете создать сервисный хост в своем тесте (самостоятельно размещенный) и загрузить свой сервис. После того, как вы настроите свои конечные точки, вы можете подключиться к ним с помощью клиентских прокси. Это должно работать с простыми HTTP и WSHTTP. В вашем модульном тесте вам необходимо создать ссылку на службу. Затем вы можете создать хост и связать ваш клиент с тестовым хостом вместе. Я хотел бы попытаться избежать каких-либо тестов, используя "WCF Service Host", также известный как WcfSvcHost. (Я упоминаю об этом только потому, что некоторые люди ссылались на утилиты Visual Studio; это будет работать только в том случае, если вы будете запускать тесты только из своей IDE.)
Если вам нужно проверить экзотические сценарии аутентификации или конечные точки, которые используют специальное промежуточное программное обеспечение, вам нужно будет создать тесты с использованием промежуточного программного обеспечения. Для простых проверок работоспособности и т. Д. Достаточно использовать собственный хостинг. Зависимое от промежуточного ПО тестирование может вызвать проблемы с тестовым развертыванием, если вы используете сервер сборки.
Под конечными точками, зависящими от промежуточного программного обеспечения, я подразумеваю конечные точки, которые используют, например, MOM (MSMQ, RabbitMQ и т. Д.) Или действительно экзотические протоколы и т. Д. Возможно, тестирование прокси-клиентов клиента с помощью собственного макета и тестирование экзотических конечных точек отдельно идти.
Если вы хотите использовать внедрение зависимостей, есть несколько довольно сложных сред, которые предоставляют функции «абстрагирования служб», которые позволяют вводить фиктивные службы и т. Д. Я использовал Spring.NET с WCF несколько раз. В замке Виндзор также есть WCF.
Пример собственного теста:
ServiceHost serviceHost = null;
try
{
var baseAddress = new Uri("http://localhost:8000/TestService");
serviceHost = new ServiceHost(typeof (ServiceClass), baseAddress);
Binding binding = new WSHttpBinding();
var address = new EndpointAddress("http://localhost:8000/TestService/MyService");
var endpoint = serviceHost
.AddServiceEndpoint(typeof (IServiceContract), binding, address.Uri);
var smb = new ServiceMetadataBehavior {HttpGetEnabled = true};
serviceHost.Description.Behaviors.Add(smb);
using (var client = new ProxyClient(endpoint.Name, endpoint.Address))
{
endpoint.Name = client.Endpoint.Name;
serviceHost.Open();
// ... magic happens
}
serviceHost.Close();
}
catch (Exception ex)
{
// ... tests
}
finally
{
if (serviceHost != null)
{
((IDisposable) serviceHost).Dispose();
}
}
Я хотел бы отметить, что инструменты функционального тестирования не совпадают с инструментами модульного тестирования. Модульное тестирование должно сводиться к разбивке вашего теста на несколько независимых тестов, в то время как функциональное тестирование в основном сводится к тестированию рабочих процессов от начала до конца.