2009-05-05 7 views
2

J'ai créé des services POX en utilisant le kit de démarrage REST. Au début, c'était un peu compliqué de créer les tests unitaires pour la couche de service, mais à la fin, c'était bien conçu et j'ai réussi à tourner en dérision le contexte et à établir des attentes. Mais, je commence avec le côté client maintenant, et j'ai quelques problèmes pour trouver comment se moquer des choses. Ce n'est pas si simple. Donc, j'ai cette méthode exemple qui publie via HTTP des données en utilisant un contrat de données et XML en tant que transport.Comment tester un WCF client construit avec WCF Rest Starter Kit

public class ServiceClient: IService 

{ 
    private const string uri_template = "http://{0}:{1}/SomeService.svc/"; 
    private readonly HttpClient http = new HttpClient(); 

    public ServiceClient(string host, int port) 
    { 
     http.BaseAddress = new Uri(string.Format(uri_template , host, port)); 
    } 

    public void Create(MyDataContract my_data_contract) 
    { 
     var content = HttpContentExtensions 
         .CreateDataContract(
          my_data_contract, 
          Encoding.Default, 
          "text/xml", 
          null); 
     var response = http.Post("Create", content); 
     if (response.StatusCode != HttpStatusCode.Created) { 
      throw new Exception("something is not right"); 
     } 
    } 
} 

Cette méthode fonctionne et affiche effectivement les données et la sérialisation correctement.

Ce que je veux faire est de le tester unitaire.

Mes questions sont les suivantes:

  1. Comment puis-je faire des talons/se moque de HttpContextExtensions sachant qu'il ne met pas en œuvre une interface?

  2. Et pour HttpClient? c'est pire car il est plein de méthodes d'extension définies ailleurs (Post et les méthodes similaires sont des extensions).

Dans 2. Je pense que je peux coller à « Envoyer » et il est surcharge, mais est alors le même problème que dans 1

Ce que je pensais faire, est d'extraire des interfaces pour HttpContextExtensions et HttpClient, crée un enfant pour chacun et implémente les interfaces déléguant au parent, puis utilise les interfaces dans mon code.

Mais c'est beaucoup de travail à mon humble avis. J'utilise RhinoMocks comme cadre de moquerie, donc je ne peux pas mock/stub classes concrètes, et je tiens à y adhérer, parce que je pense vraiment que les classes de béton moqueur n'est pas très élégant. Donc, y a-t-il une façon plus propre/plus rapide/plus intelligente de tester le code de test comme ci-dessus?

PD: Ceci est pour WCF Starter Kit aperçu 2

+0

Peut-être que je peux ajouter une étape personnalisée comme suggéré par Pablo M. Cibraro ici: http: //weblogs.asp.net/cibrax/archive/2009/03/13/httpclient-dans-le-wcf-reste-starter-kit-preview-2.aspx –

Répondre

2

Si vous voulez vraiment se moquer de ce code, une approche qui pourrait fonctionner pour ce scénario est de recevoir une instance HttpClient dans la classe serviceclient. La classe HttpClient contient un pipeline de traitement que vous pouvez personnaliser avec des gestionnaires personnalisés. Pour vos tests, vous pouvez essentiellement injecter un gestionnaire dans cette instance httpclient pour renvoyer une réponse simulée au test avant que le service réel ne soit appelé dans le dernier gestionnaire (étape de transport). Jetez un oeil à ce poste pour avoir une idée sur la façon dont cela peut être mis en œuvre,

http://weblogs.asp.net/cibrax/archive/2009/03/18/negotiating-a-saml-token-for-rest-clients-with-httpclient.aspx

Cordialement, Pablo.

+0

Merci Pablo. J'ai suivi votre conseil, mais je lui ai donné une mise en œuvre plus simple, mais juste parce que c'était tout ce dont j'avais besoin. J'ai suivi vos écrits ici http://weblogs.asp.net/cibrax/archive/2009/03/13/httpclient-in-the-wcf-rest-starter-kit-preview-2.aspx et j'ai fait mon propre HttpStage classe enfant uniquement à des fins de test et configurable pour renvoyer une réponse. Merci. –

2

J'ai écrit la plupart du code HttpClient. La suggestion de Pablo est ce que j'ai fait dans les tests unitaires - voir FixedTransport.cs dans le zip source.

+0

Je ne sais pas pourquoi je n'ai pas pensé à regarder dans la source du kit. évident!! > _ <... –

Questions connexes