2009-04-30 8 views
4

J'essaie d'utiliser RhinoMock pour se moquer d'un service wcf.Aide de RhinoMock: service de contournement WCF

Dire que j'ai le service suivant:

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

Ajouter ce service avec Visual Studio génère un proxy, et que proxy a une interface comme:

public interface ResourceService { 

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

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

Puis-je créer un ViewModel qui utilise ce service, comme ceci:

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

Puis vient la question. Comment puis-je me moquer de ce service en utilisant 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); 
    } 

Je serais vraiment heureux si quelqu'un pouvait me aider avec l'utilisation correcte de RhinoMock

(Note: J'utilise Silverlight, mais je ne pense pas que cela changerait la façon dont RhinoMock est utilisé)

Merci beaucoup!

+0

Que fait réellement Deployment.Current.Dispatcher.BeginInvoke? Cela dépend-il de la WCF? Alors vous ne pouvez pas vous moquer de ça. –

+0

Salut!J'ai supprimé l'appel Dispatcher pour la clarté (il est utilisé pour éviter les problèmes de thread croisés entre thread d'interface utilisateur et thread d'arrière-plan) – Larsi

Répondre

4

J'ai écrit un 4-part article tout au sujet des applications de test qui utilisent les services WCF.

Part 2 parle de se moquant le service à l'aide RhinoMocks

Part 3 parle de se moquant à un service asynchrone en utilisant Moq

Notez que la partie 3 peut être traduit vers RhinoMocks très facilement. J'essayais juste de montrer différents cadres moqueurs, et que la technique ne reposait pas sur le cadre moqueur.

J'espère que ça aide!

EDIT Ainsi, dans Rhino Mocks, vous le faites dans la configuration:

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

Puis dans la lecture, vous faites ceci:

loadRaiser.Raise(mockService, CreateEventArgs()); 

Vous pouvez trouver plus d'informations sur moqueurs à Rhino au Phil Haack's blog post.

+0

Bonjour, Brian, c'est exactement ce dont j'ai besoin. Merci. Je suis assez novice en matière de moquerie, et je suis en train de traduire truble de Moq à RhinoMock. Quel est le "CreatEventHandler" égal dans RhinoMock? Merci encore. – Larsi

+0

@Larsi: Voir la modification dans mon message. –

+0

@Brian. Merci encore. Bon code :-), merci à Ayende aussi. – Larsi

1

Je créerais une interface que le service implémenterait (IResourceService). Ensuite, côté Silverlight, créez une implémentation personnalisée de IResourceService qui appelle le service WCF lui-même. RihnoMock crée le talon pour l'interface IResourceService et non pour le service WCF.

Il est très facile de le faire en utilisant Prism 2, vous pouvez en lire plus ici:

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

+0

Salut Merci d'avoir répondu. Oui, j'ai essayé ça. (Je suppose que c'est ce que vous suggérez: http://inquisitorjax.blogspot.com/2008/10/mocking-out-wcf-services-in-silverlight.html) Le problème est que je suis assez nouveau à moquer et RhinoMock, donc je ne pouvais pas installer un Mock pour le IResourceService qui étendait le ResourceService autogénéré. Avez-vous la syntaxe? Merci encore – Larsi

+0

On dirait que Brian ci-dessous a décrit la même chose en utilisant Rhino Mocks. Je vais regarder dans cela et essayer de le comprendre. Merci pour votre temps. – Larsi