Справка RhinoMock: имитация службы WCF

Я пытаюсь использовать RhinoMock для имитации службы wcf.

Скажем, у меня есть следующая услуга:

    [OperationContract]
    List<User> SearchUsers(UserSearchFilter filter);

Добавление этой службы с Visual Studio сгенерирует прокси, и этот прокси имеет такой интерфейс, как:

 public interface ResourceService {

    System.IAsyncResult BeginSearchUsers(UserSearchFilter filter, System.AsyncCallback callback, object asyncState);

    ObservableCollection<User> EndSearchUsers(System.IAsyncResult result);
}

Затем я создаю ViewModel, который использует эту службу, например:

        private ResourceService service;
    public ViewModelBase(ResourceService serv)
    {
        service = serv;
        var filter = new UserSearchFilter();
        service.BeginSearchUsers(filter, a =>
        {
            this.Users = service.EndSearchUsers(a); 
        }, null);
    }

Тогда возникает вопрос. Как издеваться над этой службой с помощью RhinoMock?

       [TestMethod]
    public void UserGetsPopulatedOnCreationOfViewModel()
    {
        // Is stub the right thing to use?
        ResourceService serv = MockRepository.GenerateStub<ResourceService>();

        // Do some setup... Don't know how?
        var vm = new ViewModel(serv);

        Assert.IsTrue(vm.Users.Count > 0);
    }

Я был бы очень рад, если бы мне кто-нибудь помог с правильным использованием RhinoMock.

(Примечание: я использую Silverlight, но не думаю, что это изменит способ использования RhinoMock)

Большое спасибо!


person Larsi    schedule 30.04.2009    source источник
comment
Что на самом деле делает Deployment.Current.Dispatcher.BeginInvoke? Это зависит от WCF? Тогда нельзя над этим издеваться.   -  person Stefan Steinegger    schedule 30.04.2009
comment
Привет! Я удалил вызов диспетчера для ясности (он используется, чтобы избежать проблем с перекрестными потоками между потоком пользовательского интерфейса и фоновым потоком)   -  person Larsi    schedule 30.04.2009


Ответы (2)


Я написал Статья из 4 частей, посвященная тестированию приложений, использующих службы WCF.

Часть 2 говорит о имитации сервиса с помощью RhinoMocks

Часть 3 рассказывает об имитации асинхронного сервиса с помощью Moq.

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

Надеюсь, поможет!

РЕДАКТИРОВАТЬ Итак, в Rhino Mocks вы делаете это в настройке:

mockService.YourEvent += null;
IEventRaiser loadRaiser = LastCall.IgnoreArguments().GetEventRaiser();

Затем при воспроизведении вы делаете следующее:

loadRaiser.Raise(mockService, CreateEventArgs());

Дополнительную информацию о имитирующих событиях в Rhino можно найти в записи блога Фила Хаака.

person Brian Genisio    schedule 30.04.2009
comment
Привет, Брайан, это как раз то, что мне нужно. Спасибо. Я новичок в издевательстве, и у меня проблемы с переводом с Moq на RhinoMock. Чему равен CreatEventHandler в RhinoMock? Еще раз спасибо. - person Larsi; 01.05.2009

Я бы создал интерфейс, который будет реализовывать сервис (IResourceService). Затем на стороне Silverlight создайте собственную реализацию IResourceService, которая вызывает саму службу WCF.

RihnoMock создаст заглушку для интерфейса IResourceService, а не для службы WCF.

Это очень просто сделать с помощью Prism 2, подробнее вы можете прочитать здесь:

http://mokosh.co.uk/post/2009/04/19/prism-2-wpf-and-silverlight-services/

person Jarek Kardas    schedule 30.04.2009
comment
Привет, спасибо за ответ. Да, я пробовал. (Думаю, это то, что вы предлагаете: inquisitorjax .blogspot.com / 2008/10 /) Проблема в том, что я новичок в mocking и RhinoMock, поэтому мне не удалось настроить Mock для IResourceService, который расширил автоматически сгенерированный ResourceService. У тебя есть синтаксис? Еще раз спасибо - person Larsi; 01.05.2009
comment
Похоже, что Брайан ниже описал то же самое, используя Rhino Mocks. Я изучу это и попытаюсь понять. Спасибо за ваше время. - person Larsi; 01.05.2009