2011-11-15 6 views
1

J'ai créé ici le début d'une solution REST que j'ai codée en premier, car j'ai des problèmes pour tester le service REST. C'est mon premier coup à un service de repos alors excuses si quelque chose est gravement offensant.Unit Test Service .NET REST?

En un mot j'ai une classe concrète de manutention des travaux de service:

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class ESIID : BaseREST<ESI> 
{ 

    [OperationContract] 
    [WebGet(UriTemplate = "/{guid}/{id}", ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped)] 
    public Message LookupESIID(string guid, string id) 
    { 
     ResponseType = ResponseTypes.Json; 
     return GetById(guid, id); 
    } 

    private Message GetById(string guid, string id) 
    { 
     bllSvc = new Business.Services.TXESIIDRepository(guid); 
     var results = bllSvc.ByID(id); 

     return results.Count == 0 ? NoResults() : FormatResponse(results); 
    } 

}

qui hérite d'une base (certaines méthodes inclus pour le contexte):

public abstract class BaseREST<T> 
{ 
    protected ResponseTypes ResponseType { get; set; } 

    public Message ReturnJson(string json) 
    { 
     var webContext = WebOperationContext.Current; 
     webContext.StatusCode = HttpStatusCode.OK; 

     return webContext.CreateJsonResponse(json); 
    } 

    public Message FormatResponse(List<T> results) 
    { 
     switch (ResponseType) 
     { 
      case ResponseTypes.Json: 
       return ReturnJson(JsonConvert.SerializeObject(results)); 
       break; 
      case ResponseTypes.Xml: 
       return ReturnXml(results); 
       break; 
      default: 
       return ReturnErrorJson(new Error{ErrorDescription = "Format error", ErrorDetail = "Requested format is not valid", StatusCode = HttpStatusCode.BadRequest}); 
     } 
    } 

    public Message NoResults() 
    { 
     var err = new Error 
     { 
      ErrorDescription = ConfigurationManager.AppSettings["NotFound_Descr"] 
      , ErrorDetail = ConfigurationManager.AppSettings["NotFound_Detail"] 
      , StatusCode = HttpStatusCode.BadRequest 
     }; 

     return ReturnError(err); 
    } 
} 

I Je ne sais pas comment tester correctement l'implémentation et la classe de base. Est-il possible (et franchement bon) de créer un type de client HTTP mocké dans la configuration de test qui définirait alors l'URI? Je ne peux pas imaginer comment rendre ces classes flexibles pour les tests unitaires ET d'intégration.

Merci pour toute direction à ce sujet.

Répondre

3

Pour être honnête, je ne suis pas expert en la matière - mais dans une situation similaire, j'ai passé une interface dans le constructeur de la classe de base qui gère les fonctions embêtants de WebOperationContext, par exemple:

public interface IWebOperationContextWrapper 
{ 
    HttpStatusCode OutgoingStatusCode { get; set; } 
    string OutgoingStatusDescription { get; set; } 
} 

Le point final de service WCF réel étant une petite fonction qui instancie une instance concrète avec un vrai WOContect, qui est passé à la fonction qui fait réellement le travail, par exemple:

//wcf endpoint 
    public SomeResponseDto SomeWebMethod(string id) 
    {    
     WebOperationContextWrapper webOperationContext = new WebOperationContextWrapper(); 
     return ThisIsATestableFunctionThatCanBePassedAFakeContext(Id, webOperationContext); 
    } 

Si je veux tester la fonction du point de terminaison des appels I maintenant possible:

IWebOperationContextWrapper webOperationContext = MockRepository.GenerateStub<IWebOperationContextWrapper>(); 

     var result = svc.ThisIsATestableFunctionThatCanBePassedAFakeContext(Id, webOperationContext); 

     Assert.IsWhatever(result); 

Je ne teste pas réellement le service WCF, car tout le service WCF exécute des fonctions dans une classe découplée. Je teste cette classe.

+0

Merci, cela m'a indiqué dans la bonne direction. J'ai regardé dans WCFMock et cela semble être la voie à suivre avec l'extension du couplage WebContext cuit. À votre santé. – BryanGrimes