Comment est-ce que je me moque de HttpContext dans ASP.NET MVC utilisant Moq?

[TestMethod] public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist() { var context = new Mock(); var request = new Mock(); context .Setup(c => c.Request) .Returns(request.Object); HomeController controller = new HomeController(); controller.HttpContext = context; //Here I am getting an error (read only). ... } 

mon contrôleur de base a un remplacement de l’initialisation qui obtient ce this requestContext. J’essaie de faire passer ça mais je ne fais pas quelque chose de bien.

 protected override void Initialize(System.Web.Routing.RequestContext requestContext) { base.Initialize(requestContext); } 

Où puis-je obtenir plus d’informations sur la moquerie de mes RequestContext et HttpContext en utilisant Moq? J’essaie de simuler les cookies et le contexte général.

    HttpContext est en lecture seule, mais il est en réalité dérivé du ControllerContext, que vous pouvez définir.

      controller.ControllerContext = new ControllerContext( context.Object, new RouteData(), controller ); 

    Créez une requête, une réponse et mettez-les tous les deux dans HttpContext:

     HttpRequest httpRequest = new HttpRequest("", "http://mySomething/", ""); SsortingngWriter ssortingngWriter = new SsortingngWriter(); HttpResponse httpResponse = new HttpResponse(ssortingngWriter); HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse); 

    Merci à l’utilisateur 0100110010101.

    Cela a fonctionné pour moi et ici j’ai eu un problème en écrivant le testcase pour le code ci-dessous:

      var currentUrl = Request.Url.AbsoluteUri; 

    Et voici les lignes qui ont résolu le problème

     HomeController controller = new HomeController(); //Mock Request.Url.AbsoluteUri HttpRequest httpRequest = new HttpRequest("", "http://mySomething", ""); SsortingngWriter ssortingngWriter = new SsortingngWriter(); HttpResponse httpResponse = new HttpResponse(ssortingngWriter); HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse); controller.ControllerContext = new ControllerContext(new HttpContextWrapper(httpContextMock), new RouteData(), controller); 

    Pourrait être utile pour les autres.

    Voici un exemple de la façon dont vous pouvez configurer ceci: Mocking HttpContext HttpRequest et HttpResponse pour UnitTests (en utilisant Moq)

    Notez les méthodes d’extension qui facilitent vraiment l’utilisation de ces classes moqueuses:

     var mockHttpContext = new API_Moq_HttpContext(); var httpContext = mockHttpContext.httpContext(); httpContext.request_Write("".line()); httpContext.request_Write(" this is a web page".line()); httpContext.request_Write(""); return httpContext.request_Read(); 

    Voici un exemple de la façon d’écrire un test unitaire en utilisant moq pour vérifier qu’un HttpModule fonctionne comme prévu: Test unitaire pour HttpModule en utilisant Moq pour envelopper HttpRequest

    Mise à jour: cette API a été modifiée pour

    • HttpContextFactory.cs
    • ces multiples fichiers Http * Extension Methods

    Voici comment j’ai utilisé le ControllerContext pour passer un faux chemin d’application:

     [TestClass] public class ClassTest { private Mock mockControllerContext; private HomeController sut; [TestInitialize] public void TestInitialize() { mockControllerContext = new Mock(); sut = new HomeController(); } [TestCleanup] public void TestCleanup() { sut.Dispose(); mockControllerContext = null; } [TestMethod] public void Index_Should_Return_Default_View() { // Expectations mockControllerContext.SetupGet(x => x.HttpContext.Request.ApplicationPath) .Returns("/foo.com"); sut.ControllerContext = mockControllerContext.Object; // Act var failure = sut.Index(); // Assert Assert.IsInstanceOfType(failure, typeof(ViewResult), "Index() did not return expected ViewResult."); } }