Простой способ издеваться над сервисом WCF? - PullRequest
9 голосов
/ 02 января 2009

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

В некоторых случаях мне нужно смоделировать службу WCF, поскольку иногда получить жесткое поведение от службы сложно (например, служба генерирует особые исключения).

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

Есть ли простой способ издеваться над службой WCF? Проще, чем создать еще один интерфейсный слой и перенаправить каждый вызов WCF внутри него?

Редактировать: Большинство ответов, похоже, мало что знают об использовании сервиса WCF, поэтому некоторые пояснения:
Чтобы использовать службу WCF из ViewModel, мне нужно управлять соединением примерно так:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

Я не могу просто передать ViewModel прокси в WCF, так как соединение должно быть открыто и закрыто для каждой транзакции. По этой причине использование RhinoMock / NMock не будет работать, так как им нужен ViewModel, который получает прокси в качестве параметра, что невозможно сделать, если вы используете WCF.

Ответы [ 3 ]

9 голосов
/ 02 января 2009

Почему вы не можете использовать что-то вроде NMock2 , чтобы напрямую высмеивать интерфейсы IMyWcfService?

Если вам нужно иметь возможность создавать новые экземпляры на лету, используйте Factory, чтобы скрыть ChannelFactory<IMyWcfService> от клиента. Таким образом, вы можете заменить фабрику, предоставив клиентскую, которая создает фиктивные файлы вместо реальных прокси.

2 голосов
/ 09 января 2009

Вы можете использовать любую среду моделирования, такую ​​как RhinoMocks или NMock, чтобы смоделировать контракт интерфейса, поэтому, если ваша служба внедрила IMyService, вы можете использовать среду моделирования, чтобы установить ожидания вызовов методов для этого интерфейса. Если вы не знакомы с этой концепцией, вы можете просто создать отдельный объект, который реализует IMyService, но при тестировании выдает себя за реальную службу. Таким образом, когда вызываются методы, они вызываются для вашего резервного объекта, и вы можете получить свой возвратный элемент, как хотите.

0 голосов
/ 17 мая 2018

Ты можешь Moq насмешливый каркас. На основе предоставленного вами примера:

ChannelFactory<IMyWcfService> channelFactory = new ChannelFactory<IMyWcfService>("");
IMyWcfService proxy = channelFactory.CreateChannel();
proxy.CallMyStuff();
proxy.Close();

Вот как будет выглядеть насмешливая реализация:

Mock<IMyWcfServiceChannel> channelMock = new Mock<IMyWcfServiceChannel>(MockBehavior.Strict);
channelMock
    .Setup(c => c.CallMyStuff())
    .Returns("");

string myStuff = channelMock.Object.CallMyStuff();

После того, как вы добавили прокси для службы WCF - у вас должен быть доступный интерфейс channel, называемый IMyWcfServiceChannel.

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

Чтобы использовать вышеупомянутое решение более эффективно, вы можете создать 2 конструктора для бизнес-уровня, например:

public class Example1
{
    IMyWcfServiceChannel _client;

    public Example1()
    {
        var factory = new ChannelFactory<IMyWcfServiceChannel>("binding");
        _client = factory.CreateChannel();
    }

    public Example1(IMyWcfServiceChannel client)
    {
        _client = client;
    }

    public string CallMyStuff()
    {
        return _client.CallMyStuff();
    }
}

Итак, на prod вы используете конструктор без параметров. В unit тестах вы используете конструктор с полным параметром и передаете ему макет (channelMock.Object).

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