В своем тестовом проекте я создаю хост-класс службы, который в AssemblyInitialize тестового проекта самостоятельно размещает службу, которую я хочу вызвать.
[TestClass]
internal class ServiceHost
{
private static ServiceHost<Service1> m_Host = null;
/// <summary>
/// Setups the specified context.
/// </summary>
/// <param name="context">The context.</param>
[AssemblyInitialize]
public static void Setup(TestContext context)
{
//comment to run against local consolehost
m_Host = new ServiceHost<Service1>();
m_Host.Open();
}
/// <summary>
/// Tears down.
/// </summary>
[AssemblyCleanup]
public static void TearDown()
{
if (m_Host != null)
{
m_Host.Close();
}
}
}
В тесте я использую ChannelFactory для вызова сервиса.Затем я закрываю сервис на AssemblyCleanup.
try
{
ChannelFactory<IService> factory = new ChannelFactory<IService>("User");
IServiceproxy = factory.CreateChannel();
try
{
m_IsAuthenticated = proxy.Method("");
// Make sure to close the proxy
(proxy as IClientChannel).Close();
Assert.IsTrue(m_IsAuthenticated);
}
catch
{
if (proxy != null)
{
// If the proxy cannot close normally or an exception occurred, abort the proxy call
(proxy as IClientChannel).Abort();
}
throw;
}
}
catch (Exception ex)
{
Assert.Fail(ex.Message);
}
Предоставьте тестовому проекту собственный файл App.config с соответствующими настройками, чтобы при его размещении он соответствовал тестовой среде.Это дает вам автоматизированный тест черного ящика.Я также использую Mocks для изоляции той части сервиса, которую я хочу протестировать.