Как макетировать веб-сервисы WCF с помощью Rhino Mocks - PullRequest
6 голосов
/ 15 апреля 2010

Как проверить класс, использующий прокси-клиенты, сгенерированные по ссылке на веб-службу?

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

Я пытаюсь проверить класс, подобный этому:

public class ServiceAdapter : IServiceAdapter, IDisposable
{
    // ILoggingServiceClient is generated via a Web Service reference
    private readonly ILoggingServiceClient _loggingServiceClient; 

    public ServiceAdapter() : this(new LoggingServiceClient()) {}

    internal ServiceAdapter(ILoggingServiceClient loggingServiceClient)
    {
        _loggingServiceClient = loggingServiceClient;
    }


    public void LogSomething(string msg)
    {
        _loggingServiceClient.LogSomething(msg);
    }

    public void Dispose()
    {
        // this doesn't compile, because ILoggingServiceClient doesn't contain Close(), 
        // yet Close is required to properly terminate the WCF client
        _loggingServiceClient.Close(); 
    }
}

Ответы [ 3 ]

1 голос
/ 17 апреля 2010

Я бы создал другой интерфейс, который наследуется от вашего ILoggingServiceClient, но добавляет метод Close. Затем создайте класс-оболочку, которая оборачивает экземпляр LoggingServiceClient. Что-то вроде:

public interface IDisposableLoggingServiceClient : ILoggingServiceClient
{
    void Close();
}

public class LoggingServiceClientWrapper : IDisposableLoggingServiceClient
{
    private readonly LoggingServiceClient client;

    public LoggingServiceClientWrapper(LoggingServiceClient client)
    {
        this.client = client;
    }

    public void LogSomething(string msg)
    {
        client.LogSomething(msg);
    }

    public void Close()
    {
        client.Close();
    }
}

Теперь ваш сервисный адаптер может использовать IDisposableLoggingServiceClient.

0 голосов
/ 05 марта 2014

Это немного поздно, но я просто искал способы обойти это. Поскольку автоматически сгенерированный клиентский класс генерируется как частичный, вы можете расширить его следующим образом:

public interface ICloseableLoggingServiceClient : ILoggingServiceClient
{
    void Close();
}

public partial class LoggingServiceClient : ICloseableLoggingServiceClient
{

}

теперь ваш LoggingServiceClient объединил метод Close из ClientBase<> и все, что указано в вашем контракте на обслуживание, и вы сможете высмеивать ICloseableLoggingServiceClient с RhinoMocks. Все, что вам нужно сделать, это убедиться, что вы вводите и тестируете новый интерфейс вместо конкретного клиентского класса.

0 голосов
/ 20 мая 2010

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

...