Как протестировать клиента службы WCF - PullRequest
1 голос
/ 20 октября 2010

У меня есть служба WCF, которая предоставляет 1 метод GetNextObjectInList(int id), который обращается к БД.

Служба WCF более или менее работает следующим образом:

public class MyService : IDisposable
{
    public MyService() 
    { 
        this.IntializeDBConnection();
    }

    public int GetNextObjectInList(int id) 
    { 
        /* uses DB connection */ 
    }

    /* Dispose releases DB connection */
}

Это делаетклиентский код относительно прост:

public void UseNextElementInList()
{
    IMyService svc = new MyServiceClient();
    int nextID = svc.GetNextObjectInList(this.ID);

    /* use object */
}

Я написал модульные тесты для тестирования объектов служб WCF, но я бы хотел протестировать потребительский код для различных вещей, таких как время / производительность / обработка ошибок, но я неЯ не знаю, как сконструировать мои тесты так, чтобы Сервис не попадал в БД.

Большинство моих тестов (например, тесты, которые работают с объектами сервиса) действительно создают БД в памяти, но яне знаю, как заставить службу подключаться к ней без специального кода теста в службе.

1 Ответ

2 голосов
/ 20 октября 2010

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

        <service name="MyNamespace.TestService" behaviorConfiguration="BehaviorConfig">
            <endpoint address="net.tcp://localhost/MySolution/TestService"
                                binding="netTcpBinding"
                                bindingConfiguration="BindingConfig"
                                contract="MyNamespace.IMyService"/>

Есливы используете VS Test Project, вы можете использовать атрибуты ClassInitialize / ClassCleanup для установки / разрыва службы:

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext) {
        mHost = new ServiceHost(typeof(TestService));
        mHost.Open();
        return;
    }
    [ClassCleanup()]
    public static void MyClassCleanup() {
        if(mHost != null) {
            mHost.Close();
        }
        return;
    }

Теперь внутри класса TestService (который будет реализовывать IMyService) вы можете обеспечить любое поведение, необходимоепротестировать клиент, не беспокоясь о том, что ваши юнит-тесты повредили ваш производственный код

...