модульное тестирование метода, вызывающего службу wcf - PullRequest
7 голосов
/ 26 мая 2011

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

пример:

public void SendData(DataUnit dataUnit)
{

        //this is WCF call
        SomeServiceClient svc = new SomeServiceClient();

        svc.SomeMethod(dataUnit);

}

Есть ли способ, которым я могу насмехаться над SomeServiceClient в моем проекте модульного тестирования?

Ответы [ 2 ]

12 голосов
/ 26 мая 2011

Ваша проблема здесь в том, что вы тесно связали свой бизнес-уровень со своей службой WCF - вы фактически создаете новый экземпляр клиента службы в бизнес-уровне, что означает, что теперь невозможно вызвать метод SendData без вызова также методы обслуживания.

Лучшее решение здесь - это внедрение внедрения зависимости в вашу архитектуру.

В самом простом случае все, что вы делаете, - это передаете экземпляр своего класса обслуживания в бизнес-уровень. Это часто делается во время создания класса, используя параметр конструктора.

public class BusinessClass
{
    private ISomeServiceClient _svc;

    public BusinessClass(ISomeServiceClient svc)
    {
        _svc = svc;
    }

    public void SendData(DataUnit dataUnit)
    {
       _svc.SomeMethod(dataUnit);
    }
}

Обратите внимание, что приведенный выше код является шаблоном проектирования, абсолютно не зависящим от какой-либо инфраструктуры, такой как контейнер Inversion of Control.

Если политика вашей компании не предусматривает использование таких платформ (кстати, безумная политика), вы все равно можете вручную внедрить свои ложные экземпляры службы в свои модульные тесты.

1 голос
/ 26 мая 2011

Вы должны отделить ваш сервисный вызов от вашего бизнес-уровня:

Используя демонстрацию ниже, ваш метод бизнес-уровня, который вы перечислили, теперь будет выглядеть так:RealThing, если вы хотите сделать сервисный вызов, передайте TestThing, если вы просто хотите запустить тест:

public interface IMyInterface
{
   void SomeMethod(DataUnit x);
}

public class RealThing : IMyInterface
{
   public void SomeMethod(DataUnit x)
   {
       SomeServiceClient svc = new SomeServiceClient();
       svc.SomeMethod(x);
   }
}

public class TestThing : IMyInterface
{
   public void SomeMethod(DataUnit x)
   {
       // do your test here
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...