10 votes

En construisant un HttpContext pour les tests, comment puis-je spécifier que le HttpRequest est un POST ?

Je suis en train d'écrire des tests unitaires pour une méthode qui prend un HttpContext comme paramètre. Je veux tester que le comportement est celui attendu lorsque la requête est un POST.

Lors de la création d'un System.Net.HttpWebRequest, il est facile de définir la méthode, mais je ne vois pas de moyen de spécifier la méthode lors de la création d'un System.Web.HttpRequest qui est ce qui est utilisé dans HttpContext.

Des idées ?

Pour le contexte, la méthode est appelée par un httphandler et elle est censée renvoyer un 405 si la requête n'est pas un POST. Je sais que je peux filtrer les méthodes autorisées avec la propriété Verbs dans le web.config, et je le ferai, mais rien n'empêche quelqu'un à l'avenir de modifier la propriété Verbs pour autoriser d'autres méthodes, auquel cas je veux que le gestionnaire s'en occupe lui-même.

Méthode d'aide actuellement utilisée :

    private HttpContext GetHttpContext(string requestUrl)
    {
        var httpRequest = new HttpRequest("", requestUrl, "");            
        var stringWriter = new StringWriter();
        var httpResponce = new HttpResponse(stringWriter);
        return new HttpContext(httpRequest, httpResponce);
    }

8voto

cokeman19 Points 1720

Je vous recommande de faire des recherches sur les objets de simulation pour les tests unitaires. Il existe quelques cadres de simulation disponibles pour .NET qui facilitent exactement ce type de test.

Par exemple, l'article ici définit le HttpMethod en utilisant le framework Moq.

Extrait de l'article :

public ContextMocks(Controller onController, string HTTPMethod)
{
    //...
    Request = new Moq.Mock<HttpRequestBase>();
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod);
    //...
}

Cela dit, s'il s'agit d'un test unique, et je ne peux pas insister assez sur ce point, et que les frais généraux encourus par l'introduction de la simulation d'objet ne sont pas nécessaires dans votre situation particulière, la réflexion suivante définira le HttpMethod :

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST");

Comme je l'ai mentionné précédemment, si le test est effectué avec HttpContext , HttpRequest sont ou deviendront un thème récurrent, alors tirez parti d'un cadre de simulation. Vous gagnerez du temps sur le long terme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X