Параметры модульного тестирования отправлены в сервис WCF - PullRequest
1 голос
/ 03 ноября 2011

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

У меня есть проект, в котором у меня есть класс репозитория, который говорит с моей службой WCF. Это выглядит примерно так:

public class MyRepository : IMyRepository
{
    public Customer GetCustomer(int customerId)
    {
        var client = new MyWCFServiceClient();
        MyWCFServiceCustomer customerWCF = client.GetCustomer(customerId);
        Customer customer = ConvertCustomer(customerWCF);
        return customer;
    }

    //Convert a customer object recieved from the WCF service to a customer of
    //the type used in this project.
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF)
    {
        Customer customer = new Customer();
        customer.Id = customerWCF.Id;
        customer.Name = customerWCF.Name;
        return customer;
    }
}

(Это явно упрощено)

Теперь я хотел бы написать модульные тесты, чтобы проверить правильность параметров, которые я отправляю в сервис из репозитория. В приведенном выше примере это было бы бессмысленно, поскольку я отправляю customerId только в том виде, в котором он был передан, но в моем реальном коде больше параметров и немного логики в классе репозитория.

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

Редактировать: я был неправ по этому поводу. Есть интерфейс! Смотрите мой ответ ниже.

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

public class ClientProxy : IClientProxy
{
    public MyWCFServiceCustomer GetCustomer(int customerId)
    {
        var client = new MyWCFServiceClient();
        return client.GetCustomer(customerId);
    }
}
public interface IClientProxy
{
    MyWCFServiceCustomer GetCustomer(int customerId);
}

Таким образом, я мог бы дать этому классу интерфейс и таким образом высмеивать его. Но кажется утомительным писать этот прокси-класс и обновлять его, поэтому я надеялся, что у вас есть лучшее решение! :)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Плохо ... там на самом деле есть интерфейс к сгенерированному классу обслуживания .Я нашел это, когда искал еще.У него просто не было ожидаемого имени (в моем примере, если клиент назывался MyWCFServiceClient, я ожидал, что интерфейс будет называться IMyWCFServiceClient, но на самом деле он назывался IMyWCFService).

Так что я могпросто перепишите мой контроллер, чтобы внедрить сервисный клиент и таким образом сделать его посмешищем:

public class MyRepository : IMyRepository
{
    private readonly IMyWCFService _serviceClient;

    //Constructor
    public MyRepository(IMyWCFService serviceClient)
    {
        _serviceClient = serviceClient;
    }

    public Customer GetCustomer(int customerId)
    {
        MyWCFServiceCustomer customerWCF = _serviceClient.GetCustomer(customerId);
        Customer customer = ConvertCustomer(customerWCF);
        return customer;
    }

    //Convert a customer object recieved from the WCF service to a customer of
    //the type used in this project.
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF)
    {
        Customer customer = new Customer();
        customer.Id = customerWCF.Id;
        customer.Name = customerWCF.Name;
        return customer;
    }
}
0 голосов
/ 03 ноября 2011

Вы должны взглянуть на этот пост здесь

Вместо использования прокси-серверов ServiceReference (которые в любом случае содержат ошибки - удаление клиента всегда пытается закрыть соединение, даже если оно повреждено), вы можете использовать ClientBase<IServiceContract> напрямую .

Вы можете использовать прокси-интерфейсы Service Service, созданные с помощью ServiceReference, или, если у вас есть контроль над обоими концами ссылки, вы можете построить интерфейсы ServiceContract в отдельную сборку и поделиться ею на клиенте и сервере.

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