webentwicklung-frage-antwort-db.com.de

Wie verspotte ich den HttpContext in ASP.NET MVC mithilfe von Moq?

[TestMethod]
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist()
{
    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();
    context
        .Setup(c => c.Request)
        .Returns(request.Object);
    HomeController controller = new HomeController();

    controller.HttpContext = context; //Here I am getting an error (read only).
    ...
 }

mein Basis-Controller hat eine Überschreibung der Initialisierung, die diesen requestContext erhält. Ich versuche das weiterzugeben, aber ich mache etwas nicht richtig.

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

Wo kann ich weitere Informationen zum Verspotten von RequestContext und HttpContext mithilfe von Moq erhalten? Ich versuche, Cookies und den allgemeinen Kontext zu verspotten.

94
Geo

HttpContext ist schreibgeschützt, wird jedoch vom ControllerContext abgeleitet, den Sie festlegen können.

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

Erstellen Sie eine Anfrage, eine Antwort und fügen Sie beide in HttpContext ein:

HttpRequest httpRequest = new HttpRequest("", "http://mySomething/", "");
StringWriter stringWriter = new StringWriter();
HttpResponse httpResponse = new HttpResponse(stringWriter);
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse);
33
0100110010101

Vielen Dank Benutzer 0100110010101.

Es funktionierte für mich und hier hatte ich ein Problem beim Schreiben des Testfalls für den folgenden Code:

 var currentUrl = Request.Url.AbsoluteUri;

Und hier sind die Zeilen, die das Problem gelöst haben

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

Könnte für die anderen hilfreich sein.

10
Chandan Kumar

Hier ist ein Beispiel, wie Sie dies einrichten können: Verspotten von HttpContext HttpRequest und HttpResponse für UnitTests (mit Moq)

Beachten Sie die Erweiterungsmethoden, die die Verwendung dieser spöttischen Klassen wirklich vereinfachen:

var mockHttpContext = new API_Moq_HttpContext();

var httpContext = mockHttpContext.httpContext();

httpContext.request_Write("<html><body>".line()); 
httpContext.request_Write("   this is a web page".line());  
httpContext.request_Write("</body></html>"); 

return httpContext.request_Read();

Hier ist ein Beispiel, wie Sie einen Unit-Test mit moq schreiben, um zu überprüfen, ob ein HttpModule wie erwartet funktioniert: Unit-Test für HttpModule mit Moq zum Umbrechen von HttpRequest

Update: Diese API wurde überarbeitet

5
Dinis Cruz

So habe ich den ControllerContext verwendet, um einen falschen Anwendungspfad zu übergeben:

[TestClass]
public class ClassTest
{
    private Mock<ControllerContext> mockControllerContext;
    private HomeController sut;

    [TestInitialize]
    public void TestInitialize()
    {
        mockControllerContext = new Mock<ControllerContext>();
        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.");
    }
}
4
Xolartek