[c#] Moq를 사용하여 ASP.NET MVC에서 HttpContext를 어떻게 모의합니까?

[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).
    ...
 }

내 기본 컨트롤러에는이 requestContext를 가져 오는 Initialize의 재정의가 있습니다. 나는 이것을 전달하려고 노력하고 있지만 옳은 일을하고 있지 않습니다.

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

Moq를 사용하여 RequestContext 및 HttpContext를 조롱하는 방법에 대한 자세한 정보는 어디에서 얻을 수 있습니까? 나는 쿠키와 일반적인 맥락을 모의하려고 노력하고 있습니다.



답변

HttpContext는 읽기 전용이지만 실제로는 설정할 수있는 ControllerContext에서 파생됩니다.

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


답변

요청, 응답을 생성하고 둘 다 HttpContext에 넣습니다.

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


답변

감사합니다 사용자 0100110010101.

그것은 나를 위해 일했으며 아래 코드에 대한 테스트 케이스를 작성하는 동안 문제가 발생했습니다.

 var currentUrl = Request.Url.AbsoluteUri;

그리고 여기에 문제를 해결 한 라인이 있습니다

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);

다른 사람들에게 도움이 될 수 있습니다.


답변

ControllerContext를 사용하여 가짜 애플리케이션 경로를 전달하는 방법은 다음과 같습니다.

[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.");
    }
}


답변

다음은이를 설정하는 방법의 예입니다. Mocking HttpContext HttpRequest 및 UnitTests 용 HttpResponse (Moq 사용)

이 모의 클래스의 사용을 단순화하는 데 도움이되는 확장 메서드에 유의하십시오.

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();

다음은 moq를 사용하여 단위 테스트를 작성하여 HttpModule이 예상대로 작동하는지 확인하는 방법의 예입니다. HttpRequest를 래핑하기 위해 Moq를 사용하여 HttpModule에 대한 단위 테스트

업데이트 :이 API는 다음으로 리팩터링되었습니다.


답변