105 votes

Mock HttpContext pour les tests unitaires d'un contrôleur MVC central .NET?

J'ai une fonction dans un contrôleur que je suis en train de tester qui attend des valeurs dans l'en-tête de la requête http. Je ne peux pas initialiser le HttpContext parce qu'il est en lecture seule.

Ma fonction de contrôleur attend une valeur d'en-tête de demande http pour "ID-appareil"

 [TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();

    //not valid controller.HttpContext is readonly
    //controller.HttpContext = new DefaultHttpContext(); 

    var result = controller.Get();
    Assert.AreEqual(result.Count(), 2);
}
 

Existe-t-il un moyen simple de faire cela sans utiliser une bibliothèque tierce?

240voto

James Wierzba Points 5885

J'ai pu initialiser le httpcontext et l'en-tête de cette façon:

 [TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    controller.ControllerContext = new ControllerContext();
    controller.ControllerContext.HttpContext = new DefaultHttpContext();
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317";
    var result = controller.Get();
    //the controller correctly receives the http header key value pair device-id:20317
    ...
}
 

20voto

GlennSills Points 940

Plutôt que de se moquant de la HTTPContext, c'est probablement une meilleure idée de la carte à l'en-tête dans un paramètre à la méthode. Par exemple, dans le contrôleur au bas de cette réponse, l' id paramètre est réglé à la valeur d'en-tête avec un nom différent de "device-id"... L'unité de test devient alors

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}

Alors que vous pouvez simuler le HttpContext, à mon avis c'est quelque chose qui doit être évitée sauf si vous n'avez pas le choix. La documentation pour la FromHeaderAttribute peut être trouvé ici FromHeaderAttribute Classe.

    public class ValuesController: Controller
    {

      public string GetHeaderValue([FromHeader(Name = "device-id")] string id)
      {
        return id;
      }
    }

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