[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는 다음으로 리팩터링되었습니다.
- HttpContextFactory.cs
- 이러한 여러 Http * Extension Methods 파일